Biblioteca? Estático? Dinâmico? Ou estrutura? Projeto dentro de outro projeto

151

Eu tenho um aplicativo iOS existente e quero adicionar um grande pedaço de código que venho desenvolvendo como outro projeto apenas para facilitar o teste. O novo pedaço basicamente trata de salvar uma imagem em vários serviços de compartilhamento, etc. Como esse código de compartilhamento precisa de muitos testes e atualizações futuras, eu queria saber qual a melhor maneira de incorporar esse pedaço de código ao meu aplicativo existente.

Não sei se deve ser uma biblioteca estática, uma biblioteca dinâmica ou uma estrutura e, sinceramente, não tenho muita certeza de qual é a diferença, ou como devo proceder e configurá-la no Xcode.

Tudo o que sei é que preciso / quero manter um aplicativo de teste e atualização separado para o código de compartilhamento e que o aplicativo principal o use.

pizzafilms
fonte
Você pode criar uma estrutura guarda-chuva que é algo como 'estrutura dentro da estrutura' stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi
possível duplicata de Como criar uma estrutura Umbrella no iOS sdk?
Mohd Iftekhar Qurashi

Respostas:

204

Primeiro, algumas definições gerais (específicas para iOS):

Biblioteca estática - uma unidade de código vinculada no tempo de compilação, que não muda.

No entanto, as bibliotecas estáticas do iOS não têm permissão para conter imagens / ativos (apenas código). Você pode contornar esse desafio usando um pacote de mídia .

Uma definição melhor e mais formal pode ser encontrada na Wikipedia aqui .

Biblioteca dinâmica - uma unidade de código e / ou ativos vinculados em tempo de execução que podem mudar.

No entanto, apenas a Apple tem permissão para criar bibliotecas dinâmicas para iOS. Você não pode criá-los, pois isso fará com que seu aplicativo seja rejeitado. (Veja esta outra postagem do SO para confirmação e raciocínio sobre isso).

Estrutura de software - um conjunto compilado de código que realiza uma tarefa ... portanto, você pode realmente ter uma estrutura estática ou dinâmica , que normalmente são apenas as versões compiladas acima.

Veja o Wiki on Software Framework para mais detalhes.

Portanto, no iOS, sua única opção é basicamente usar uma biblioteca estática ou estrutura estática (a principal diferença é que uma estrutura estática é distribuída como um .aarquivo compilado com mais freqüência, enquanto uma biblioteca estática pode simplesmente ser incluída como um subprojeto - você pode ver todo o código - que é compilado primeiro e seu .aarquivo resultante usado como dependência do projeto).

Agora que estamos claros nesses termos, configurar uma biblioteca estática e oferecer suporte ao pacote de mídia para iOS não é muito difícil, e há muitos tutoriais sobre como fazer isso. Pessoalmente, eu recomendaria este:

https://github.com/jverkoey/iOS-Framework

Este é um guia bastante direto e não tem a desvantagem de lidar com "bibliotecas estáticas falsas" ... confira para mais informações ...

Depois de criar sua biblioteca estática, é tão fácil quanto incluí-la como um submódulo no Git para uso em diferentes projetos.

Boa sorte.

EDITAR

Em relação a um subprojeto em um projeto, tanto quanto eu sei, para que isso funcione / compile corretamente, você precisa essencialmente configurar uma cadeia de compilação em que o subprojeto seja compilado primeiro, o que cria um .aarquivo de estrutura estática que é usado como dependência pelo projeto.

Aqui está outro tutorial útil que fala sobre isso:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

EDIT 2

A partir do iOS 8, a Apple agora permite que os desenvolvedores criem estruturas dinâmicas! (Observação: seu aplicativo deve ter um destino mínimo do iOS 8 para incluir uma estrutura dinâmica ... a entrada traseira não é permitida.)

Isso foi adicionado como um novo modelo de projeto. No Xcode 6.1, isso pode ser encontrado em:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
JRG-Developer
fonte
Até agora, parece que o subprojeto é o que eu quero e esse artigo foi perfeito. Percebi um efeito colateral estranho: o subprojeto que eu arrastei dentro do meu projeto principal também possui o meu código de teste (viewcontroller e nib, appdelegate, etc), e certifiquei-me de que apenas as classes que eu quero usar no O projeto principal é verificado para ser usado na biblioteca estática. Mas, por algum motivo, quando fiz anexos ao arquivo de ponta do meu projeto principal, ele também mostrou saídas e ações do meu subprojeto. Isso definitivamente poderia levar a alguma confusão. Alguma dica para se livrar deles? Obrigado!
pizzafilms
Um projeto dinâmico pode ser arrastado e solto em um projeto estático, tornando-o um projeto estático? Estou realmente confuso, algum esclarecimento seria ótimo! Agradecemos antecipadamente :-)
Ravindranath Akila
1
@ JRG-Developer Voltar quadro dinâmico portar é permitido se você seguir algumas regras: developer.apple.com/library/prerelease/ios/documentation/...
klefevre
É possível definir um objetivo mínimo mais baixo e tornar a biblioteca opcional?
Kukudas
1. você pode incluir alguns exemplos bem conhecidos de biblioteca estática, biblioteca dinâmica, estrutura? 2. Você pode dar exemplos de onde você precisaria fazer isso? 3. Curioso, qual é a diferença entre um pod e uma biblioteca estática?
Mel
29

Formato de arquivo Mach-O (Mach Object - .o)

No mundo iOS, todos os arquivos de origem são convertidos em arquivos de objetos - arquivo ABI [About] Mach-O [About], que será empacotado em um pacote executável final (por exemplo, aplicativo, framework ...), arquivo (por exemplo, biblioteca ...) e seu comportamento é determinado por Mach-O type[Sobre]

Packageé um diretório que se comporta como um arquivo - opaque file. É criado para a experiência do usuário complique algumas alterações na estrutura interna que podem causar comportamento imprevisível do programa. O pacote é usado em Document Packageou com um Bundle. Você pode usar Show Package Contentsem um localizador

Bundleé um diretório com uma estrutura específica para organizar um binário (código executável) e recursos para esse código (por exemplo, imagens, pontas ...). O pacote contém Info.plist[Sobre] arquivo . O pacote foi criado para a experiência do desenvolvedor . Também pode ser empacotado. Existem vários tipos de pacote configurável:

  • application bundle - Application target
  • framework bundlee versioned bundlecomo um subtipo -Framework Target
  • loadable bundle(aka plug-in bundle ) - Bundle target(Pacote de testes de interface do usuário, Pacote de testes de unidade)
  • outros ( dSYM[Sobre] pacote)

Application- .ipa, .app[Sobre] -packaged application bundle - programa iniciável.

Tests - packaged loadable bundle que é usado para testar um binário. A arquitetura de plug-in nos permite adicionar uma nova funcionalidade (casos de teste) como um módulo separado aos binários existentes

Bibliotecas e estruturas

Martin Fowler em InversionOfControl

Uma biblioteca é essencialmente um conjunto de funções que você pode chamar, atualmente organizado em classes. Cada chamada realiza algum trabalho e retorna o controle ao cliente.

Um Framework incorpora algum design abstrato, com mais comportamento incorporado. Para usá-lo, você precisa inserir seu comportamento em vários locais do framework, subclassificando ou conectando suas próprias classes. O código da estrutura chama seu código nesses pontos. O controle principal do programa é invertido, afastado de você para o framework. (Inversão de controle)

Bibliotecas e estruturas no iOS

Libraryé uma coleção de arquivos de objetos Mach-O [verifique estáticos ou dinâmicos] compilados para uma ou mais arquiteturas.

Static library- .a(também conhecida como biblioteca de archive estático, biblioteca compartilhada vinculada estática [doc] ) - Quando você o adiciona ao aplicativo, o vinculador estático durante o tempo de compilação mescla os arquivos de objeto da biblioteca e os empacota junto com os arquivos de objeto do aplicativo em um único executável Arquivo. A desvantagem é um grande arquivo de saída

A partir do Xcode 9.0, a biblioteca estática Swift é suportada.

Dynamic library- .dylib(também conhecida como biblioteca compartilhada dinâmica, objeto compartilhado, biblioteca vinculada dinamicamente [doc] ) é vinculada dinamicamente ao executável do aplicativo em carga ou tempo de execução , mas não é copiada para ele. Na prática, o pacote do aplicativo conterá a pasta Frameworks com o .dylibarquivo. Todas as bibliotecas do sistema iOS e macOS são dynamic. A desvantagem é um tempo de inicialização lento, pois todas as bibliotecas dinâmicas devem ser copiadas e vinculadas.

[Ligação estática vs dinâmica]

Text-based stub library- .tbd[Sobre] , é um esboço dynamic libraryque está localizado no dispositivo de destino. Como resultado, você não deve empacotar uma biblioteca dinâmica em seu pacote. Tem um efeito de tamanho.

Frameworkaka binary framework- .frameworké um not packaged framework bundle(para permitir que os desenvolvedores analisem facilmente cabeçalhos e recursos) que contém uma static or dynamicbiblioteca compilada , arquivos e recursos de cabeçalho.

Static frameworkconter um static librarypacote com seus recursos.

Dynamic frameworkcontém os dynamic libraryrecursos Além disso, a estrutura dinâmica pode incluir versões diferentes da mesma biblioteca dinâmica em um único pacote configurável ( versioned bundle)

[Estrutura estática versus dinâmica]

Embedded frameworké um dynamic frameworkque vive na caixa de areia do aplicativo. Esse tipo foi criado antes de tudo para a extensão compartilhar códigos e recursos comuns. Está disponível quando o destino de implantação é o iOS 8 ou superior.

Umbrella framework [Destino agregado] é uma estrutura que contém outras estruturas. Não é oficialmente suportado no iOS e é por isso que não é recomendado que os desenvolvedores os criem [Documento oficial] . Na realidade, é um conjunto de subestruturas (ou estruturas aninhadas). Quando você cria uma estrutura que possui uma dependência, um consumidor (como um aplicativo) é responsável por adicionar essa dependência junto com sua estrutura no projeto. Como desenvolvedor, é natural tentar encontrar uma maneira de transferir esse imposto do consumidor para o seu. Como resultado, você acha que esseUmbrella frameworké o resgate, mas geralmente leva a problemas sérios no gerenciamento de versões e na complexidade de sua criação e suporte.

Fake Framework- é o resultado de operações específicas sob a static librarypara criar um pacote com .frameworkextensão que se comportará como a dynamic framework. Essa técnica foi usada quando o Xcode não suportava a criação de uma estrutura, pois não possuía um modelo de estrutura. Um dos realização de um quadro falso . Com o Xcode 6, a Apple adicionou suporte à estrutura do iOS.

Modular Framework[About] -@importé uma estrutura que contém um.modulemaparquivo dentro. O módulo pode conter submódulos. A principal vantagem é que você economiza um tempo de compilaçãoModular Framework.

Universal Library or Framework(aka Fat) [lipo] [destino agregado] contém várias arquiteturas. Por exemplo, a versão do seu release deve suportar um arco que você pode regular via Build Active Architecture Only [ONLY_ACTIVE_ARCH]

Dependency[Sobre] Você pode usar código de terceiros como parte do seu destino. Ele permite que você reutilize um código de várias fontes, como - outro projeto, projeto no mesmo espaço de trabalho, outro destino, biblioteca, estrutura etc.

Como criar e usar uma biblioteca estática:

Como criar e usar um Dynamic Framework [mude para estático]

[Sistema de compilação do Xcode]
[componentes do Xcode]
[Linker dinâmico]

yoAlex5
fonte
1
Em muitos tutoriais do Swift, mencionamos que o Objective C não suporta bibliotecas dinâmicas, onde o Swift suporta, [ altexsoft.com/blog/engineering/… ]. Mas como eu sei, OS8 em diante O Objctive C suporta a biblioteca dinâmica. Você pode esclarecer isso?
pratima 14/01
@pratima, você é capaz de criar uma estrutura dinâmica no Objective-C para iOS
yoAlex5
1
"A estrutura estática contém uma biblioteca estática empacotada com seus recursos." De onde veio essa definição? AFAK, a fase de construção "Copy Bundle Resources" da estrutura estática não funciona, assim como a biblioteca estática. Qual é a diferença entre estrutura estática e biblioteca estática?
toshi0383 18/04
@ toshi0383 Você encontrou uma maneira de mesclar a biblioteca estática (.a) e seus recursos (.bundle) em uma única estrutura que podemos distribuir ao consumidor?
user121095 3/06