Esclarecimentos sobre estruturas estáticas e dinâmicas do iOS

115

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?
csotiriou
fonte
1
"iOS 7 não oferece suporte a bibliotecas .framework porque não oferece suporte a links dinâmicos" Esta afirmação não está correta.
Midhun MP
1
Entendo. você pode me dizer a frase correta? É falso porque o iOS 7 oferece suporte a links dinâmicos ou porque o iOS 7 oferece suporte a bibliotecas .framework? Ou ambos?
csotiriou
1
Remeber AVFoundation e CoreGraphics são todos .framework. Provavelmente, isso o ajudará a encontrar as respostas para todas as suas perguntas: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
Eu consertei a frase. Já li o link, antes de postar minhas dúvidas. Este link não explica nada sobre minhas perguntas. Ele começa a partir de uma biblioteca estática e o agrupa em um arquivo .framework MANUALMENTE. Estou falando sobre um destino Cocoa Touch Framework no Xcode 6 e, em seguida, alterando o tipo em uma biblioteca estática. Não menciona a assinatura de código (por que e se é necessário), recursos adicionais, etc.
csotiriou
1
Você pode usar o CocoaPods para distribuir uma estrutura proprietária (por exemplo, Parse)
Ric Santos

Respostas:

69

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

Subbu
fonte
16

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 typeconfigurações do framework de destino. Esta técnica também é aplicável a Hybrid Frameworks (frameworks com código Swift e Objective-C).

Avijeet Dutta
fonte
Ótima dica. Não sei por que essa resposta foi reduzida, pois me ajudou. \ Target'Build Settings \ Mach-O-Type e selecione Static Framework.
rustyMagnet
3
A compatibilidade Abi não está disponível no swift 4
csotiriou
7

staticou dynamicno nome geralmente aponta para um tipo Linking[Sobre]

As estruturas podem ser staticou dynamic[verificar estático ou dinâmico]

Você pode alterar o formato da biblioteca que terá impacto em um Linkeralterando Framework target -> Build Settings -> Mach-O Type[Sobre] para Static Libraryou Dynamic Library. Por padrão, o Xcode tem Dynamic Libraryvalor.

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 do static libraryarquivo 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]

yoAlex5
fonte
6

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

AliasCocoa
fonte
Você pode importar uma biblioteca estática para um projeto baseado em swift
C0D3
5

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.

Beau Nouvelle
fonte