Por que usamos use_frameworks no CocoaPods?

104

Eu usei o use_frameworksCocoaPods Podfilemuitas vezes. Eu só me pergunto por que o usamos? Não consegui obter uma resposta direta.

Exemplo:

platform :ios, '8.0'
use_frameworks!

target "CityWhether" do
    pod 'Alamofire'
    pod 'SwiftyJSON'
end
harikrista
fonte
1
Você quer dizer use_frameworks! COM o ponto de exclamação? Sempre fiquei confuso sobre isso! significa NÃO.
Gabriel Jensen

Respostas:

120

use_frameworksdiz ao CocoaPods que você deseja usar Frameworks em vez de Bibliotecas estáticas. Como o Swift não oferece suporte a Bibliotecas estáticas, você deve usar frameworks.


Em outra resposta, expliquei as diferenças entre bibliotecas estáticas e frameworks:

Cocoa Touch Frameworks

Eles são sempre de código aberto e serão desenvolvidos da mesma forma que seu aplicativo. (Então, às vezes, o Xcode o compila, quando você executa seu aplicativo e sempre depois de limpar o projeto.) Frameworks suportam apenas iOS 8 e mais recente, mas você pode usar Swift e Objective-C no framework.

Bibliotecas estáticas Cocoa Touch

Como o nome diz, eles são estáticos. Portanto, eles já estão compilados, quando você os importa para o seu projeto. Você pode compartilhá-los com outras pessoas sem mostrar seu código. Observe que as bibliotecas estáticas atualmente não oferecem suporte a Swift. Você terá que usar Objective-C dentro da biblioteca. O próprio aplicativo ainda pode ser escrito em Swift.

Fontes: Minha outra resposta | Blog AddThis.com

FelixSFD
fonte
3
Longa história sobre as notas de lançamento blog.cocoapods.org/CocoaPods-0.36
Jaime Agudo
7
bibliotecas estáticas agora suportam swift a partir do Xcode 9 beta 4 - CocoaPods está sendo atualizado para suportar isso, consulte github.com/CocoaPods/CocoaPods/issues/6899
JosephH
Descrição
agradável
76

use_frameworks!diz aos pods de cacau para usar bibliotecas dinâmicas, e foi muito prevalente em um ponto devido em particular ao swift não suportar bibliotecas estáticas, o que significa que não havia escolha - entretanto, muitas vezes você não precisa use_frameworks!mais.

A partir do Xcode 9 beta 4 e do CocoaPods 1.5.0, as bibliotecas estáticas swift agora são suportadas. A principal vantagem é o tempo de inicialização do aplicativo mais rápido, especialmente se você tiver muitos pods - iOS 10 e 11 não são os mais rápidos quando você tem muitos dylibs.

CocoaPods 1.5.0 foi lançado no início de abril 2018 , então você pode precisar atualizar para obtê-lo: sudo gem install cocoapods.

Eu encontrei vários pods que ainda não funcionam corretamente com bibliotecas estáticas, então sua milhagem pode variar.

JosephH
fonte
2
Eu fiz isso e então encontrei os mesmos No such moduleerros. Isso é um problema nesses cocos?
Alper
3
Tive de adicionar use_modular_headers!ao meu Podfile para fazê-lo funcionar com pods que presumivelmente exigem, mas ainda não o habilitam.
Adrian
4
@JosephH "A principal vantagem é o tempo de inicialização do aplicativo mais rápido". Isso parece estar em contradição com a documentação da Biblioteca Dinâmica da Apple - que faz a mesma afirmação das dlls: "minimizar o uso de memória uma vez que é lançado faz o aplicativo iniciar mais rápido". A implicação aqui é que as dlls resultarão em tempos de inicialização mais rápidos se a biblioteca em uso não for necessária no momento da inicialização ou se for uma biblioteca popular e, portanto, já estiver carregada na memória?
TolkienWASP
3
@TolkienWASP Essa página parece ser mais sobre macOS do que iOS. Mas, sim, se a DLL não for carregada até depois da inicialização, a DLL será uma vitória. Infelizmente, no caso do iOS, nas situações em que vi todas as DLLs serem carregadas antes de o aplicativo terminar de ser iniciado, isso torna as coisas mais lentas. Há pelo menos uma palestra na WWDC sobre o assunto de otimização dos tempos de inicialização de aplicativos iOS e mencionou explicitamente algo como garantir que você não tivesse mais do que 3 ou 4 dlls.
JosephH
1
Acho que este é o vídeo mencionado acima: developer.apple.com/videos/play/wwdc2016/406 Eu encorajo você a usar a variável de ambiente DYLD_PRINT_STATISTICS para medir a velocidade de inicialização do seu aplicativo e ver o que é melhor para você.
iMacHumphries
2

use_frameworksdeclara que você deseja usar estruturas dinâmicas , em vez de bibliotecas estáticas .

Com o Xcode 9.0 e o CocoaPods 1.5.0 lançados, você pode usar bibliotecas estáticas com o swift se não usar use_frameworks.

Um problema use_frameworksé que todos os seus frameworks em Pods / Produtos são frameworks.

Aqui está um artigo relacionado: Visão geral básica de estruturas estáticas e dinâmicas no ios

Mistdon
fonte
4
> One performance with use_frameworks is that all your framework in Pods/Products is frameworks. Uma apresentação o quê?
Alex Zavatone
2

O Cocoapod's [About] use_frameworks! é responsável pelo tipo de binário:

  • se use_frameworks!estiver presente -dynamic framework
  • se nãouse_frameworks! estiver presente -static library

use_frameworks!tem um reflexo em Mach-O Type[Sobre] em um destino correspondente do Podsprojeto.

Linha do tempo:

  1. CocoaPods 0,36 introduzido use_frameworks!que você tinha que usar para Swift pod
  2. CocoaPods 1.5.0 e Xcode 9 permitiram que você tivesse uma escolha

[Vocabulário]

yoAlex5
fonte
-1

Adicionando

use_frameworks!

no Podfile significa que queremos que as estruturas listadas sejam instaladas dinamicamente em vez de estruturas estáticas.

Chiara
fonte
Obrigado, mas forneça mais detalhes sobre a instalação dinâmica vs instalação estática.
BuffK de