Com o Xcode 6, temos a capacidade de criar o próprio Dynamic Cocoa Frameworks
.
Por causa de:
Simulador ainda usa
32-bit
biblioteca-
a partir de 1º de junho de 2015, as atualizações de aplicativos enviadas para a App Store devem incluir suporte de 64 bits e ser desenvolvidas com o iOS 8 SDK ( developer.apple.com )
Temos que fazer uma biblioteca de gordura para rodar projetos em dispositivos e simuladores. ou seja, suporta 32 e 64 bits em Frameworks.
Mas eu não encontrei nenhum manual de como exportar o Fat Framework universal para integração futura com outros projetos (e compartilhar esta biblioteca com alguém).
Aqui estão meus passos para reproduzir:
Situado
ONLY_ACTIVE_ARCH=NO
noBuild Settings
Adicionar suporte
armv7 armv7s arm64 i386 x86_64
paraArchitectures
(com certeza)
- Construa o Framework e abra-o no Finder:
- Adicione esta estrutura a outro projeto
Resultado atual:
Mas no final eu ainda tenho problemas em executar projeto com este framework em dispositivos e simulador de uma vez.
se eu pegar o framework da
Debug-iphoneos
pasta - ele funciona em dispositivos e obtém erros em simuladores:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
As arquiteturas no arquivo fat: CoreActionSheetPicker são: armv7 armv7s arm64
se eu pegar o quadro da
Debug-iphonesimulator
pasta - funciona em simuladores. e eu tenho um erro no dispositivo:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
As arquiteturas no arquivo fat: CoreActionSheetPicker são: i386 x86_64
Então, como criar um framework dinâmico que funcione em dispositivos e simuladores?
Esta resposta está relacionada ao Xcode 6 iOS Criando um Cocoa Touch Framework - problemas de arquitetura, mas não é duplicado.
Atualizar:
Eu encontrei um "hack sujo" para este caso. Veja minha resposta abaixo . Se alguém souber de uma maneira mais conveniente - por favor, me avise!
fonte
Respostas:
A realidade desta resposta é: julho de 2015. É mais provável que as coisas mudem.
TLDR;
Atualmente o Xcode não possui ferramentas para exportação automática de framework fat universal, então o desenvolvedor deve recorrer ao uso manual da
lipo
ferramenta. Ainda de acordo com este radar, antes do envio ao desenvolvedor da AppStore, que é o consumidor do framework, também deve ser usadolipo
para retirar fatias do simulador de um framework.Segue-se uma resposta mais longa
Fiz uma pesquisa semelhante no tópico (o link na parte inferior da resposta).
Eu não tinha encontrado qualquer documentação oficial sobre distribuição de então minha pesquisa foi baseada na exploração da Apple Developer Forum, projetos de Carthage e Realm e minhas próprias experiências com
xcodebuild
,lipo
,codesign
ferramentas.Aqui está uma longa citação (com um pouco de marcação minha) do tópico do Apple Developer Forums Exporting app with embedded framework :
Isso descreve o processo da mesma forma que @skywinder o fez em sua resposta.
É assim que Carthage usa lipo e Realm usa lipo .
DETALHE IMPORTANTE
Há radar: Xcode 6.1.1 e 6.2: frameworks iOS contendo fatias do simulador não podem ser enviados para a App Store e uma longa discussão sobre isso no Realm # 1163 e Carthage # 188 que terminou em uma solução alternativa especial:
antes do envio à AppStore, os binários da estrutura do iOS devem ser retirados das fatias do simulador
Carthage tem um código especial: CopyFrameworks e peça de documentação correspondente:
O Realm tem um script especial: strip-frameworks.sh e peça de documentação correspondente:
Também há um bom artigo: Removendo arquiteturas indesejadas de bibliotecas dinâmicas no Xcode .
Eu mesmo usei o Realm's,
strip-frameworks.sh
que funcionou perfeitamente para mim, sem nenhuma modificação, embora, claro, qualquer pessoa seja livre para escrever um do zero.O link para o meu tópico que recomendo ler porque contém outro aspecto desta questão: assinatura de código - Criando frameworks iOS / OSX: é necessário assiná-los antes de distribuí-los para outros desenvolvedores?
fonte
Esta não é uma solução tão clara, mas só há uma maneira que eu encontro:
Situado
ONLY_ACTIVE_ARCH=NO
noBuild Settings
Abra na
Products
pasta do console para o seu framework (você pode abri-lo abrindo a pasta do framework ecd ..
de lá)Products
pasta. Ele cria o Fat Framework nesta pasta. (ou faça-o manualmente conforme explicado abaixo em 3. 4. )Ou:
Combine esses 2 Frameworks usando lipo por este script (substitua
YourFrameworkName
pelo nome do seu Framework)Substitua por um novo binário das estruturas existentes:
./YourFrameworkName.framework
- é um binário gordo pronto para usar! Você pode importá-lo para o seu projeto!Para o projeto, que não está nos espaços de trabalho:
Você também pode tentar usar essa essência conforme descrito aqui . Mas parece que não funciona para projetos em espaços de trabalho.
fonte
Debug-
pasta é usada comlipo -create
? Esta estrutura pode ser usada paraRelease
configuração e por quê? Obrigado.A resposta de @Stainlav foi muito útil, mas o que eu fiz em vez disso foi compilar duas versões do framework (uma para o dispositivo e outra para o simulador) e depois adicionei o seguinte
Run Script Phase
para copiar automaticamente o framework pré-compilado necessário para a arquitetura em execuçãoDesta forma, não tenho uso
lipo
para criar uma estrutura gorda nem o Realmstrip-frameworks.sh
para remover as fatias desnecessárias ao enviar para a App Store.fonte
${SRCROOT}/Frameworks/Active
pasta. Eles são substituídos pelas estruturas pré-compiladas corretas para a arquitetura ativa em tempo de compilação.lipo
abordagem de combinar e separar .basicamente para isso eu encontrei uma solução muito boa. você só precisa seguir estas etapas simples.
e é isso. Aqui, mesclamos o simulador e a versão do dispositivo do binário MyFramework presente em MyFramework.framework. Obtemos uma estrutura universal que se baseia em todas as arquiteturas, incluindo simulador e dispositivo.
fonte
Eu só quero atualizar esta ótima resposta de @odm. Desde o Xcode 10, a
CURRENT_ARCH
variável não reflete mais a arquitetura de construção. Então, mudei o script para verificar a plataforma:Também adicionei uma linha para limpar o diretório de destino antes de copiar, porque percebi que os arquivos adicionais nos subdiretórios não seriam substituídos de outra forma.
fonte
Minha resposta cobre os pontos abaixo:
Faça uma estrutura que funcione tanto para o simulador quanto para o dispositivo
Como exportar o Cocoa Touch Framework “fat” (para Simulador e Dispositivo)?
Símbolos indefinidos para arquitetura x86_64
ld: símbolo (s) não encontrado (s) para arquitetura x86_64
Etapas 1: primeiro construa suas estruturas com o alvo do simulador
Etapas 2: após o sucesso do processo de construção do simulador, agora crie para sua estrutura com seleção de destino de dispositivo ou seleção de dispositivo iOS genérico
Etapa 3: agora selecione o destino da sua estrutura e, para isso, em "Build Phases", selecione "Add Run Script" e copie o código de script abaixo)
Passo 4: Agora, finalmente, construa novamente e sua estrutura estará pronta para o simulador e a compatibilidade do dispositivo. Viva !!!!
[Observação: devemos ter a estrutura compatível pronta antes da etapa 4 final (simulador e arquitetura de dispositivo compatível, caso contrário, siga as etapas 1 e 2 acima corretamente)
Veja a imagem de referência:
Coloque o código abaixo na área do shell:
fonte