Tenho que admitir que, com o lançamento do iOS 8, estou um pouco confuso sobre os frameworks dinâmicos e estáticos no iOS.
Estou procurando uma maneira de distribuir uma biblioteca que criei e preciso oferecer suporte ao iOS 7 e superior. (Observação: esta será uma estrutura proprietária. Não posso usar cápsulas de cacau e também não posso distribuir a fonte). Aqui está o que eu já sei:
- O iOS 8 introduziu "estruturas incorporadas" para iOS, mas, pelo que entendi, elas não funcionam para iOS 7, apenas para iOS 8 e superior.
- Tenho a opção de distribuir minha biblioteca como uma biblioteca estática (arquivo .a) e também distribuir os cabeçalhos. Sei que essa é uma maneira comum de lidar com a situação, mas gostaria de encontrar algo mais simples do que isso (e também agrupar alguns recursos com isso, se possível).
- Também descobri que o iOS 7 não oferece suporte a bibliotecas .framework dinâmicas (apenas estáticas) porque não oferece suporte a links dinâmicos. Mas o iOS 8 sim, assim como links estáticos.
E aqui estão minhas perguntas sobre essas informações:
- Eu vi que posso criar um alvo .framework, e torná-lo estático, mudando o tipo Mach-O para "biblioteca estática. Isso seria o suficiente para suportar iOS 7 sem problemas, e também para distribuir minha biblioteca como um Pacote .framework? Em caso afirmativo, por que os "frameworks incorporados" no iOS 8 são tão importantes, como muitos recursos na internet estão sugerindo? Estou perdendo alguma coisa?
- É necessário codificar o .framework da mesma forma que faço com qualquer outro aplicativo que eu fizer?
- E se eu precisar incluir outros recursos (como Core Data ou Images) com meu arquivo .framework? Vou precisar fazer um arquivo .bundle separado para isso?
Respostas:
Antes do iOS8, o Xcode permitia apenas a opção de criar bibliotecas estáticas para iOS. O problema comum era que tínhamos que enviar o binário e os cabeçalhos separadamente.
Mais tarde, alguns desenvolvedores tiveram a ideia de criar 'estruturas estáticas'. [o .framework é apenas uma pasta com links simbólicos para a lib e os cabeçalhos]. Um exemplo é https://github.com/jverkoey/iOS-Framework
Esta opção funcionará para iOS 7 ou 8 ou antes disso. Porque são apenas bibliotecas estáticas com a conveniência de agrupar os arquivos de cabeçalho junto.
Quanto às suas perguntas sobre os recursos, precisaríamos agrupá-los em '.bundle'. Para enviá-los, não tenho certeza se podemos incluí-los na pasta .framework. No passado, costumava enviar minhas bibliotecas como uma estrutura estática e pacote ...
No entanto, a opção acima não funcionará para você se usar o Swift. O Xcode não oferece suporte à construção de bibliotecas estáticas que incluem código swift.
Você deve ir com estruturas dinâmicas se houver uso rápido. Em teoria, as estruturas dinâmicas funcionam no iOS7 .. Mas, acho que o iTunes Connect rejeitará se o aplicativo for direcionado ao iOS7 e usar estruturas dinâmicas :-).
Espero que isto ajude
fonte
Com o Xcode 9 em diante, você também pode criar estruturas estáticas para Swift. Isso é possível devido à compatibilidade da fonte ABI. Tudo o que você precisa fazer é apenas alterar as
Mach-O type
configurações do framework de destino. Esta técnica também é aplicável a Hybrid Frameworks (frameworks com código Swift e Objective-C).fonte
static
oudynamic
no nome geralmente aponta para um tipoLinking
[Sobre]As estruturas podem ser
static
oudynamic
[verificar estático ou dinâmico]Você pode alterar o formato da biblioteca que terá impacto em um
Linker
alterandoFramework target -> Build Settings -> Mach-O Type
[Sobre] paraStatic Library
ouDynamic Library
. Por padrão, o Xcode temDynamic Library
valor.Depende desta configuração, diferentes tipos de binários serão gerados
Depois de configurar com sucesso um consumidor [Link vs Embed]
Static Linker
ld : em tempo de compilação incluirá todo o código dostatic library
arquivo de objeto executável.Dynamic Linker
dyld : em tempo de carregamento / execução tentará encontrar a estrutura incorporada usando@rpath
[Sobre] e vinculá-la[Vocabulário]
fonte
Swift não funciona em biblioteca estática. Se você tiver que usar a estrutura dinâmica, deve definir o mínimo do iOS para 8.0 porque a AppStore rejeita o ios 7 com estrutura dinâmica
fonte
Não tenho todas as respostas, mas tentarei responder a algumas de suas perguntas aqui.
Você receberá um aviso por usar essas estruturas no iOS 7, mas é só um aviso. Veja esta resposta .
Você pode incluir outros recursos como CoreData, mas será necessário criá-los manualmente no código. Aqui está um tutorial que mostra como criar um modelo de dados principal.
Você deve codificar bibliotecas dinâmicas de assinatura para iOS.
Você precisa ter certeza de que sua estrutura oferece suporte a arquiteturas de simulador e dispositivo, se estiver planejando distribuí-la.
fonte