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.
fonte
Respostas:
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
.a
arquivo 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.a
arquivo 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
.a
arquivo 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:
fonte
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 emDocument Package
ou com umBundle
. Você pode usarShow Package Contents
em um localizadorBundle
é 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émInfo.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 bundle
eversioned bundle
como um subtipo -Framework Target
loadable bundle
(akaplug-in bundle
) -Bundle target
(Pacote de testes de interface do usuário, Pacote de testes de unidade)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 existentesBibliotecas e estruturas
Martin Fowler em InversionOfControl
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ídaA 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.dylib
arquivo. Todas as bibliotecas do sistema iOS e macOS sãodynamic
. 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çodynamic library
que 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.Framework
akabinary framework
-.framework
é umnot packaged framework bundle
(para permitir que os desenvolvedores analisem facilmente cabeçalhos e recursos) que contém umastatic or dynamic
biblioteca compilada , arquivos e recursos de cabeçalho.Static framework
conter umstatic library
pacote com seus recursos.Dynamic framework
contém osdynamic library
recursos 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
é umdynamic framework
que 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 astatic library
para criar um pacote com.framework
extensão que se comportará como adynamic 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.modulemap
arquivo 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 viaBuild 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]
fonte
Você também pode criar o arquivo .podspec para o CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) e usá-lo como qualquer outro pod com o A única diferença é que é o seu pod privado e não é visível para o mundo exterior (não sei o que acontecerá se o seu pod criar o modelo CoreData, mas esse não é o caso, pelo que entendi).
fonte