Esta falha foi um problema de bloqueio. Usei as seguintes etapas para reproduzir o problema:
- Criar um projeto do Cocoa Touch Framework
- Adicione um arquivo rápido e uma classe Dog
- Construa uma estrutura para o dispositivo
- Crie um aplicativo Single View no Swift
- Importar estrutura para o projeto do aplicativo
- Instanciar classe rápida a partir da estrutura no ViewController
- Crie e execute um aplicativo no dispositivo
O aplicativo caiu imediatamente após o lançamento, eis o log do console:
dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
Reason: image not found
Eu tentei construir em dispositivos iOS 7.1 e 8.0, ambos têm a mesma falha. No entanto, posso criar um aplicativo e executar o simulador com precisão. Além disso, estou ciente de que posso alterar a estrutura para formar Obrigatório para Opcional no Link Binário Com Bibliotecas , mas não resolveu completamente o problema, o aplicativo travou ao criar uma instância do Dog . O comportamento é diferente no dispositivo e no simulador. Suspeito que não possamos distribuir uma estrutura para o dispositivo usando uma versão beta do Xcode. Alguém pode esclarecer isto?
Link Binary with Libraries
e, de alguma forma, o Xcode sabe copiá-las no pacote de aplicativos, enquanto que para estruturas personalizadas isso simplesmente não acontece.Respostas:
Na guia Geral do destino , há um campo Binários incorporados . Quando você adiciona a estrutura, a falha é resolvida.
A referência está aqui nos Fóruns de desenvolvedores da Apple.
fonte
Para iOS maior ou igual a 8
Na guia Geral do destino, na seção Binários incorporados, adicione a estrutura. Isso copiará a estrutura na compilada para que ela possa ser vinculada ao tempo de execução.
Por que isso está acontecendo? : porque a estrutura à qual você está vinculando é compilada como uma estrutura vinculada dinamicamente e, portanto, está vinculada ao tempo de execução.
** Nota: ** A incorporação de estruturas personalizadas é suportada apenas no iOS> 8 e, portanto, segue uma solução alternativa que funciona em versões mais antigas do iOS.
Para iOS com menos de 8
Se você influenciar essa estrutura (tenha acesso ao código-fonte / processo de construção), poderá alterar essa estrutura para ser vinculada estaticamente, em vez de dinâmica. Isso fará com que o código seja incluído no aplicativo compilado em vez de vinculado ao tempo de execução e, portanto, a estrutura não precisará ser incorporada.
** Como: ** Na guia Build Setting da estrutura, na seção Linking, altere o Mach-O Type para Static Library. Agora você não precisa incluir a estrutura em binários incorporados.
Incluindo ativos: para incluir itens como imagens, áudio ou arquivos xib / nib, recomendo a criação de um pacote (essencialmente um diretório, mais informações aqui bit.ly/ios_bundle) e carregue os recursos do pacote usando o NSBundle.
fonte
Swift is not supported for static libraries
Apenas arrastar a estrutura para o seu projeto não será bom o suficiente. É como estar no mesmo estádio, mas não conseguir encontrar seus filhos. Siga esses passos:
1) Crie sua estrutura
COMMAND
+B
construa sua estrutura e garanta que você receba "Build Succeeded".2) Acesse sua estrutura
Products
pasta no seu projeto..framework
e selecione "Mostrar no Finder".3) Coloque a estrutura em seu projeto
.framework
partir da janela do Finder para a pasta "Framework" do seu projeto de aplicativo.4) Configure o projeto do aplicativo para a estrutura
+
botão. No menu suspenso, escolha "Nova fase de arquivos de cópia".Destination
como "Estruturas". Deixe o subcaminho vazio. Em seguida, clique no+
botão no canto inferior esquerdo.5) Limpe e execute seu projeto
COMMAND
+SHIFT
+K
COMMAND
+R
fonte
Criei uma estrutura usando o Swift3 / Xcode 8.1 e a estava consumindo em um projeto do Objective-C / Xcode 8.1. Para corrigir esse problema, tive que ativar a
Always Embed Swift Standard Libraries
opção emBuild Options
.Dê uma olhada nesta captura de tela:
fonte
Embedded Binaries
seção do meu alvo . Então, por que isso faz funcionar?Em primeiro lugar, tente criar após Command + Option + Shift + K. Se ainda falhar, siga as etapas abaixo.
Se alguém estiver enfrentando esse erro no Xcode 8, altere o status da estrutura para Opcional em vez de Necessário na guia Geral do seu destino.
fonte
Eu tenho o mesmo tipo de problema na versão iOS 9.x
Resolvi esse problema alterando
Required
paraOptional
dentroLinked Frameworks and Libraries
daUserNotifications.framework
estrutura.fonte
Eu precisava (além do mencionado aqui) adicionar a seguinte linha aos Runpath Search Paths na guia Build Settings :
@executable_path/Frameworks
fonte
Você precisa adicionar a estrutura a uma nova fase de criação de arquivos de cópia para garantir que a estrutura seja copiada no pacote de aplicativos em tempo de execução.
Consulte Como adicionar uma 'Fase de criação de arquivos de cópia' ao meu Target para obter mais informações.
Documentos oficiais da Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html
fonte
Se você estiver usando o Xcode 11 ou mais recente :
Role para baixo até Estruturas, bibliotecas e conteúdo incorporado .
Verifique se o valor Incorporar e assinar ou Incorporar sem assinatura está selecionado para a opção Incorporar, se necessário.
fonte
Adicionar a estrutura nos binários incorporados
Em seguida, limpe e construa.
fonte
Surpreendentemente, nem todas as peças necessárias estão documentadas aqui, pelo menos para o Xcode 8.
Meu caso foi uma estrutura personalizada como parte do mesmo espaço de trabalho. Acontece que ele estava sendo construído incorretamente. Com base na última resposta de jeremyhu a este tópico:
https://forums.developer.apple.com/thread/4687
Eu tive que definir
Dynamic Library Install Name Base
(DYLIB_INSTALL_NAME_BASE
) sobBuild Settings
o projeto de estrutura e depois reconstruí-lo. Foi definido incorretamente como$(LOCAL_LIBRARY_DIR)
e tive que alterá-lo para@rpath
.Portanto, no estágio de processamento do link no App Project, ele estava instruindo o aplicativo host a carregar dinamicamente a estrutura no tempo de execução
/Library/Frameworks/fw.Framework/fw
(a partir da raiz do sistema de arquivos de tempo de execução) em vez do caminho para o aplicativo/Frameworks/fw.Framework/fw
Em relação a todas as outras definições: ela não tem que ser em 3 lugares
Build Phases
, mas estes são tudo pronto ao mesmo tempo em que você simplesmente adicioná-lo àEmbedded Binaries
configuração doGeneral
guia da App hospedagem.Eu fiz não tem que configurar um extra de
Copy Files
fase, que parece intuitivamente redundante em relação ao estágio de incorporação de qualquer maneira. Ao verificar o final da transcrição da compilação, podemos garantir que isso não é necessário.[Muitas linhas detalhadas foram removidas, mas fica claro na transcrição simplificada na interface do usuário do Xcode.]
Ainda não tenho idéia do porquê o Xcode definir o
DYLIB_INSTALL_NAME_BASE
valor incorretamente para mim.fonte
No meu caso, a solução foi remover a estrutura compilada dos binários incorporados, que era um projeto independente no espaço de trabalho, limpá-lo e reconstruí-lo e, finalmente, adicioná-lo novamente aos binários incorporados.
fonte
Meu ambiente: Cocos2d 2.0, Box2d, Objective C
Além de responder às outras respostas acima, finalmente fui para a guia Geral e tornei o WatchKit opcional.
fonte
Se você estiver usando uma estrutura de terceiros e usando Cocoapods como seu gerenciador de dependências, tente fazer um
pod install
para atualizar seus pods.Esta falha ocorreu em uma biblioteca de terceiros que eu estava usando, tão feliz que a solução acima funcionou para mim, espero que funcione para você!
fonte
Resolvido para mim desmarcando "Copiar apenas quando instalado" em Fases de construção-> Incorporar estruturas
fonte
É um erro de tempo de execução causado por
Dynamic Linker
O erro
Library not loaded
com@rpath
indica queDynamic Linker
não é possível encontrar o binário.Verifique se a estrutura dinâmica foi adicionada ao
General -> Embedded Binaries
Verifique a
@rpath
configuração entre consumidor (aplicativo) e produtor (estrutura dinâmica):Build Settings -> Dynamic Library Install Name
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Vinculador dinâmico
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
que é usado porloadable bundle
(Dynamic framework
como derivado) ondedyld
entra em jogoDynamic Library Install Name
- caminho para o arquivo binário (não .framework). Sim, eles têm o mesmo nome, masMyFramework.framework
é umpackaged bundle
comMyFramework
arquivo binário e os recursos dentro.Este caminho de directório pode ser absoluta ou relativa (por exemplo
@executable_path
,@loader_path
,@rpath
). O caminho relativo é mais preferível porque é alterado juntamente com uma âncora que é útil quando você distribui seu pacote configurável como um único diretóriocaminho absoluto - exemplo Framework1
@executable_path
@executable_path - relativo à entrada binária - exemplo de caso de uso do Framework2
: incorporar a
Dynamic framework
em um aplicativo@loader_path
@loader_path - relativo ao pacote configurável que é proprietário deste
caso de uso binário : framework com framework incorporado - Framework3_1 com Framework3_2 dentro
@rpath - Caminho de pesquisa do caminho da execução
Exemplo de Framework2
Anteriormente, tínhamos que configurar um Framework para trabalhar com dyld. Não é conveniente porque o mesmo Framework não pode ser usado com configurações diferentes
@rpath
é um conceito composto que se baseia em partes externas (Aplicativo) e aninhadas (Estrutura dinâmica):Inscrição:
Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)
- define uma lista de modelos que são substituídos por@rpath
.Build Phases -> Embed Frameworks -> Destination, Subpath
para evitar a localização exata da estrutura de incorporaçãoEstrutura dinâmica:
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
- ponto que@rpath
é usado junto com o caminho do pacote local para um binário*
../
- vá para o pai do diretório atualotool
- ferramenta de exibição de arquivo de objetoinstall_name_tool
alterar nomes de instalação dinâmicos da biblioteca compartilhada usando-rpath
CocoaPods
usause_frameworks!
[Sobre] para regular umDynamic Linker
[Vocabulário]
fonte
Recentemente, ocorreu esse problema ao importar o CoreNFC em iphones mais antigos (por exemplo, iPhone 6) e Xcode (11.3.1). Consegui fazê-lo funcionar
Isso me permitiu compilar para iPhones mais antigos / mais novos sem fazer alterações no código. Espero que isso ajude outros.
fonte
Eu tive o mesmo problema. Tentei criar meu projeto com um iPhone que nunca usei antes e não adicionei uma nova estrutura. Para mim, a limpeza funcionou bem ( Shift + Command + K ). Talvez seja porque eu uso a beta 5 do Xcode 7 e um iPhone 6 com o iOS 9 Beta, mas funcionou.
fonte
No meu caso, meu projeto é escrito pelo objetivo-c e na biblioteca existem arquivos Swift. Então mudei "Always Embed Swift Standard Libraries" na guia Build Settings do meu projeto para Yes e ficou totalmente correto.
fonte
Para qualquer projeto ou projeto de estrutura no Xcode que use pods, uma maneira fácil de evitar que a biblioteca dinâmica (dylb) não seja carregada é definir o arquivo de pod para tinta no modo estático. Para fazer isso, certifique-se de não escrever a seguinte linha no seu arquivo pod.
Depois que a linha excluída do arquivo que você salvou, basta executar no console:
fonte
Se tiver pod de desenvolvimento Exclua seu aplicativo do simulador, instale do pod -> clean -> execute novamente ...
fonte
O mesmo ocorreu quando criei um novo esquema de configuração e compilação.
Então a solução para mim foi executar
para esta configuração recém-criada.
fonte
Depois de tentar todos os métodos disponíveis na internet e meus próprios truques de tentativa e erro 100 vezes. Finalmente eu fui capaz de resolvê-lo. - Apeksha Sahu 6 mins atrás
Saltar para o iTunes no Mac -> contas -> Autorizar este computador - Apeksha Sahu 5 minutos atrás
segundo passo .... Vá para o desenvolvedor nas configurações do iPad e iPhone e reindexe com identificadores e limpe tudo de confiança dos computadores. Funcionou para mim ........ ....... Depois de reinstalar a versão 10.13.15 da versão mais recente do Mac OS seirra beta, para reinstalar a versão mais recente do Xcode, após atualizar todos os certificados. etc etc etc ... quantos métodos você achar que eu fiz. -
fonte
Tente alterar o sinalizador
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
(nas versões anteriores do xcode:)Embedded Content Contains Swift Code
nas Configurações de compilação de NÃO para SIM.fonte
Xcode 11
fonte
No Xcode 11
Eu estava enfrentando o mesmo problema
Alterar "Não incorporar" na guia Geral > "Estruturas, bibliotecas e conteúdo incorporado" ainda estava causando o mesmo erro.
O que resolvi para mim foi adicionar a seção Estrutura na guia Fases de construção > seção Incorporar estruturas
--Atualizada---
Observei que em projetos criados em versões anteriores da seção Xcode Embed Frameworks não está disponível quando executado no Xcode 11, encontre as etapas abaixo para obter a solução:
1: Primeiro, adicione a fase Novos arquivos de cópia na guia Fases de construção .
2: Segunda alteração do nome da fase adicionada para Embed Frameworks
3: Mude o destino para Frameworks .
4: Adicione a estrutura para a qual o erro ocorreu.
fonte
Embora todo mundo esteja dizendo para incorporar a estrutura nos binários incorporados, ainda assim não está funcionando, porque estamos perdendo uma etapa importante aqui.
Aqui estão as duas etapas corretas para adicionar os binários na guia Binários incorporados:
Remova a estrutura que está apresentando o erro das "Bibliotecas e estruturas vinculadas" na guia Geral.
Agora adicione a estrutura removida apenas na guia Binários incorporados e isso é tudo o que você precisa fazer.
Execute-o no dispositivo e mantenha esse sorriso;)
fonte
As etapas acima resolveram meus problemas.
fonte
A solução simples é seguir esta captura de tela e a falha desaparece:
Observado: Este é o Xcode 11.5
fonte
Caso alguém ainda esteja enfrentando esse problema, apesar de seguir todas as etapas descritas nas muitas outras respostas, talvez seja necessário revogar e recriar seu certificado de assinatura de código , conforme a seguir:
https://developer.apple.com/library/ios/qa/qa1886/_index.html
fonte