Eu abri a recompensa: "Procurando uma resposta tirada de fontes confiáveis e / ou oficiais." mas não recebo desde então.
Embora a resposta fornecida por @jackslash esteja correta, ela conta apenas uma parte da história, então quero escrever a minha própria de uma maneira que gostaria de ter visto no momento em que estava fazendo esta pergunta.
A realidade desta resposta é: julho de 2015. É mais provável que as coisas mudem.
Em primeiro lugar, vamos afirmar que as ações necessárias para a assinatura correta do código do framework devem ser divididas em etapas que o desenvolvedor do framework deve seguir e etapas que o consumidor do framework deve executar.
TLDR;
Para a estrutura OSX: O desenvolvedor é livre para distribuir a estrutura OSX sem codificá-la, pois o consumidor irá recodificá-la de qualquer maneira.
Para a estrutura iOS: o desenvolvedor é livre para distribuir a estrutura iOS sem codificá-la, pois o consumidor irá recodificá-la de qualquer maneira, mas o desenvolvedor é forçado pelo Xcode a codificar sua estrutura quando construir para um dispositivo iOS.
Por causa do radar: "frameworks iOS contendo fatias de simulador não podem ser enviados para a App Store" O consumidor de framework iOS é forçado a executar um script especial como "copy_frameworks" ou "strip_frameworks" que usa lipo -remove
para retirar fatias de simulador de framework iOS e re -codesigns estrutura despojada porque neste ponto sua identidade de codesigning o que quer que fosse (ou não fosse) é removida como efeito colateral da lipo -remove
manipulação.
Segue uma resposta mais longa.
Esta resposta não é um "desenho de fontes credíveis e / ou oficiais", mas sim baseada em uma série de observações empíricas.
Observação empírica # 1: O consumidor não se importa porque eles irão recodificar a estrutura que recebem do desenvolvedor
Distribuições de estruturas binárias de projetos de código aberto conhecidos no Github não são codificadas . O comando codesign -d -vvvv
fornece: "o objeto de código não está assinado de forma alguma" em todas as estruturas binárias do iOS e OSX que usei para explorar. Alguns exemplos: ReactiveCocoa and Mantle , Realm , PromiseKit .
A partir dessa observação, fica claro que os autores desses frameworks pretendem que eles sejam codificados pelo Consumidor, em seu nome, ou seja, um Consumidor deve usar a sinalização "Code Sign on Copy" na fase de construção "Embed frameworks" fornecida pelo Xcode ou usar algum shell personalizado script que faz a mesma coisa manualmente: framework de codesigns em nome do consumidor.
Não encontrei nenhum exemplo do oposto: estrutura de código aberto que seria distribuída com identidade de assinatura de código nela, portanto, no restante da resposta, estou assumindo essa abordagem amplamente adotada como correta: não há necessidade do desenvolvedor de estrutura distribuir sua estrutura a outros desenvolvedores com identidade de codificação, porque o consumidor irá recodificá-la de qualquer maneira .
Observação empírica # 2 que se aplica apenas ao iOS e que é inteiramente uma preocupação do desenvolvedor
Enquanto consumidor não se importa se estrutura que recebem de desenvolvedor é codesigned ou não, desenvolvedor ainda precisa CodeSign seu quadro iOS como parte de seu processo de criação quando construí-lo para o dispositivo iOS , porque caso contrário Xcode não construir: CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'
. Para citar Justin Spahr-Summers :
Os frameworks do OS X não precisam ser codificados na construção ... Infelizmente, o Xcode exige que os frameworks iOS sejam codificados no momento da construção.
Isso responde bem à minha pergunta nº 2: a identidade de "desenvolvedor de iPhone" é o suficiente para persuadir o Xcode de modo que ele crie uma estrutura iOS para o dispositivo. Este comentário em Cartago # 339 diz a mesma coisa.
Observação empírica # 3: ferramenta lipo
Comportamento específico da ferramenta lipo: quando aplicado a binário quadro, sempre de forma recursiva remove quaisquer identidades CodeSign dele : lipo -create/-remove codesigned framework ... -> not codesigned framework
.
Esta poderia ser uma resposta por que todos os exemplos na observação nº 1 não são codificados de forma alguma: sua identidade de codificação é perdida após a aplicação da lipo, mas desde que, de acordo com a observação nº 1, o consumidor não se importa, está tudo bem.
Esta observação é especialmente relevante para a próxima observação nº 4 sobre a AppStore.
Observação empírica nº 4: frameworks iOS contendo fatias de simulador não podem ser enviados para a App Store
Isso é amplamente discutido em: Realm # 1163 e Carthage # 188 e o radar é aberto: rdar: // 19209161 .
Essa é uma preocupação inteiramente do Consumidor: para a estrutura universal do iOS que o Consumidor inclui em seu aplicativo, quando o aplicativo está sendo construído, ele deve executar um script especial (Fase Run Script customizada) que remove a fatia do simulador do binário dessa estrutura para que o aplicativo possa passar na validação do AppStore.
O bom exemplo de frameworks binários que encontrei em Realm: strip-frameworks.sh .
Ele usa lipo
para remover todas as fatias de arquiteturas que não sejam ${VALID_ARCHS}
e então recodifica-as com a identidade do consumidor - é aqui que a observação # 3 entra em ação: a estrutura deve ser recodificada por causa de manipulações lipo nela.
Carthage tem o script CopyFrameworks.swift que faz a mesma coisa com todos os frameworks incluídos pelo Consumer: ele remove as fatias do simulador e recodifica o framework em nome do Consumer.
Também há um bom artigo: Removendo arquiteturas indesejadas de bibliotecas dinâmicas no Xcode .
Agora, a visão geral das etapas necessárias para produzir iOS e OSX a partir da perspectiva do desenvolvedor e do consumidor. Primeiro o mais fácil:
OSX
Desenvolvedor:
- Constrói estrutura OSX
- Dá ao consumidor
Nenhuma atividade de codesigning é exigida do desenvolvedor.
Consumidor:
- Recebe estrutura OSX do desenvolvedor
- Copia a estrutura para Frameworks / diretório e a codifica automaticamente em seu nome, do Consumidor, como parte do processo de "Assinatura de código na cópia".
iOS
Desenvolvedor:
- Constrói estrutura iOS para dispositivo. O Codesigning é exigido pelo Xcode, a identidade "iPhone Developer" é suficiente.
- Constrói estrutura iOS para simulador.
- Usa lipo que produz estrutura iOS universal dos dois anteriores. Neste ponto, a identidade de codificação de 1 etapa é perdida: binário de estrutura universal "não é assinado", mas tudo bem, já que "O consumidor não se importa".
- Dá ao consumidor
Consumidor:
- Recebe estrutura iOS do desenvolvedor
- Copia a estrutura para Frameworks / diretório (esta etapa pode ser redundante, dependendo de qual script é a etapa 3).
- Usa script especial como parte do processo de construção: este script remove fatias do simulador da estrutura do iOS e, em seguida, recodifica-a em seu nome, o consumidor.