iOS / OSXフレームワークの作成:他の開発者に配布する前に、それらをコード署名する必要がありますか?


90

iOSとOSXのフレームワークを作成する方法を学んでいます。iOSを例にとってみましょう。これまでのところ、次の手順が有効です。

  1. -sdkiphonesimulatorとビルドアクションを使用したxcodebuildフレームワーク
  2. -sdkiphoneosとビルドアクションを使用したxcodebuildフレームワーク
  3. リポツールを使用してユニバーサルバイナリを作成しlipo -info、期待どおりの結果を生成します。

fatファイルのアーキテクチャ:Foo.framework / Fooは次のとおりです:i386 x86_64 armv7 arm64

質問は次のとおりです。

  1. フレームワークを使用している開発者がフレームワークに再署名できることを読みました:「CodeSign on Copy」ですが、その前提条件が何であるかわかりません。つまり、以前に署名IDを使用してそのユニバーサルバイナリをコード署名するためにコード署名ステップを追加する必要があります。他の開発者に配布しますか?

  2. 以前が肯定的である場合-「iPhoneDistribution:...」IDまたは「iPhoneDeveloper:...」を使用する必要があります(一部のiOSプロジェクトの一部である私のフレームワークがあらゆる種類の検証、特にAppStore検証に合格するように) )?.

私の答えの背景は、「CodeSignエラー:SDK「iOS8.3」の製品タイプ「フレームワーク」にはコード署名が必要です」であり、これは多くのサードパーティフレームワークで見られ、Carthage#235または「コードオブジェクトは署名されていませんまったく」(1つの例:Realm#1998で報告した問題。

したがって、フレームワークのユーザーがフレームワークを使用するときに、コード署名の問題が発生しないようにしたいと思います。

PSこの質問は、単一の開発者ではなく、フレームワークベンダーである組織に適用するとさらに興味深いものになります。


このコメントは、「CODE_SIGN_IDENTITY = iPhone Developer」の使用を提案していますが、「iPhoneDistribution」の代わりに「Developer」が使用されている理由は明確ではありません。
スタニスラフパンケビッチ2015年



フレームワークを配布するときに質問があります。デバッグビルドまたはリリースビルドを配布しますか?リリースビルドで配布する場合、これを行う方法は?
niczm25 2017

@ niczm25、これは私がそれを行う方法の1つの方法です:stanislaw.github.io/2015/11/23/…
スタニスラフパンケビッチ2017

回答:


137

私は賞金を開きました:「信頼できるおよび/または公式の情報源から引き出された答えを探しています。」しかし、それ以来、そのようなものを受け取っていません。

@jackslashの回答は正解ですが、話の一部しか伝えていないので、この質問をした瞬間に見たかったような書き方をしたいと思います。

この回答の実際は2015年7月です。状況が変わる可能性が最も高いです。

フレームワークの正しいコード署名のために必要な措置を分けする必要があることをすべてのletのアサートの最初のフレームワークの開発を取るために持っていることのステップフレームワークの消費者が取るために持っていることの手順。

TLDR;

OSXフレームワークの場合:コンシューマーがとにかく再設計するため、開発者はコード署名せずにOSXフレームワークを自由に配布できます。

iOSフレームワークの場合:コンシューマーがとにかく再共同設計するため、開発者はコード署名せずにiOSフレームワークを自由に配布できますが、開発者はiOSデバイス用にビルドするときにXcodeによってフレームワークをコード署名する必要があります。

レーダーのため:「シミュレータースライスを含むiOSフレームワークはApp Storeに送信できません」iOSフレームワークの消費者は、iOSフレームワークlipo -removeからシミュレータースライスを取り除き、再実行するために使用する「copy_frameworks」や「strip_frameworks」などの特別なスクリプトを実行する必要があります。-codesignsはフレームワークを削除しました。これは、この時点で、コード署名IDがlipo -remove操作の副作用として削除されたためです。

より長い答えが続きます。


この答えは「信頼できるおよび/または公式の情報源からの引用」ではなく、多くの経験的観察に基づいています。

経験的観察#1:消費者は、開発者から受け取ったフレームワークを再設計するため、気にしません

Github上の有名なオープンソースプロジェクトのバイナリフレームワークディストリビューションはコード署名さていません。コマンドcodesign -d -vvvvは、私が調査したすべてのバイナリiOSおよびOSXフレームワークで「コードオブジェクトはまったく署名されていません」と表示します。いくつかの例: ReactiveCocoaMantleRealmPromiseKit

この観察から、これらのフレームワークの作成者は、コンシューマーがコード署名することを意図していることは明らかです。つまり、コンシューマーは、Xcodeが提供する「埋め込みフレームワーク」ビルドフェーズで「コードサインオンコピー」フラグを使用するか、カスタムシェルを使用する必要があります。同じことを手動で行うスクリプト:コンシューマーに代わってcodesignsフレームワーク。

反対の例は1つも見つかりませんでした。コード署名IDを使用して配布されるオープンソースフレームワークであるため、残りの回答では、この広く採用されているアプローチを正しいものと想定しています。フレームワーク開発者が行う必要はありません。コンシューマーはとにかくそれを再設計するので、フレームワークをコード署名IDを持つ他の開発者に配布します。

iOSのみに適用され、完全に開発者の関心事である経験的観察#2

コンシューマーは、開発者から受け取ったフレームワークがコード署名されているかどうかを気にしませんが、開発者は、iOSデバイス用にビルドするときに、ビルドプロセスの一部としてiOSフレームワークをコード署名する必要がありますCodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'。そうしないと、Xcodeはビルドされません。Justin Spahr-Summersを引用するには:

OS Xフレームワークはビルド時にコード署名する必要はありません...残念ながら、XcodeではiOSフレームワークをビルド時にコード署名する必要があります。

これは私の質問#2にかなりよく答えます:「iPhone開発者」のアイデンティティは、デバイス用のiOSフレームワークを構築するためにXcodeをキャジョルするのに十分です。Carthage#339に関するこのコメントは同じことを言っています。

経験的観察#3:リポツール

リポツールの特定の動作:フレームワークバイナリに適用すると、コードサインIDが常に再帰的に削除されますlipo -create/-remove codesigned framework ... -> not codesigned framework

これは、観察#1のすべての例がコード署名されていない理由の答えである可能性があります。lipoが適用された後、それらのコード署名IDは吹き飛ばされますが、観察#1によると、消費者はそれで問題ありません。

この観察結果は、AppStoreに関する次の観察結果#4に特に関連しています。

経験的観察#4:シミュレータースライスを含むiOSフレームワークをAppStoreに送信できません

これは、Realm#1163Carthage#188で広く議論されており、レーダーが開かれています:rdar:// 19209161

これは完全にコンシューマーの懸念事項です。コンシューマーがアプリケーションに含めるiOSユニバーサルフレームワークの場合、アプリケーションのビルド時に、アプリがAppStore検証に合格できるように、フレームワークのバイナリからシミュレータースライスを削除する特別なスクリプト(カスタム実行スクリプトフェーズ)を実行する必要があります。

Realmで見つけたバイナリフレームワークの良い例:strip-frameworks.sh

これはlipo、アーキテクチャのすべてのスライスを削除してから${VALID_ARCHS}、コンシューマーのIDで再設計するために使用します。ここで、観察#3が始まります。フレームワークは、リポ操作のために再設計されます。

CarthageにはCopyFrameworks.swiftスクリプトがあり、Consumerに含まれるすべてのフレームワークに対して同じことを行います。Consumerに代わってシミュレータースライスを取り除き、フレームワークを再設計します。

また、良い記事があります:Xcodeのダイナミックライブラリから不要なアーキテクチャを取り除く


ここで、開発者と消費者の両方の観点からiOSとOSXの両方を作成するために必要な手順の概要を説明します。まず簡単なもの:

OSX

開発者:

  1. OSXフレームワークを構築します
  2. 消費者にそれを与える

開発者によるコード署名アクティビティは必要ありません。

消費者:

  1. 開発者からOSXフレームワークを受け取ります
  2. フレームワークをFrameworks /ディレクトリにコピーし、「Code Sign on Copy」プロセスの一部として、コンシューマーに代わって自動的にコード署名します。

iOS

開発者:

  1. デバイス用のiOSフレームワークを構築します。Xcodeでは共同設計が必要です。「iPhone開発者」のアイデンティティで十分です。
  2. シミュレーター用のiOSフレームワークを構築します。
  3. 前の2つからユニバーサルiOSフレームワークを生成するlipoを使用します。この時点で、1ステップのコード署名IDが失われます。ユニバーサルフレームワークバイナリは「まったく署名されていません」が、「消費者は気にしない」ので問題ありません。
  4. 消費者にそれを与える

消費者:

  1. 開発者からiOSフレームワークを受け取ります
  2. フレームワークをFrameworks /ディレクトリにコピーします(このステップは、ステップ3のスクリプトによっては冗長になる場合があります)。
  3. ビルドプロセスの一部として特別なスクリプトを使用します。このスクリプトは、iOSフレームワークからシミュレータースライスを取り除き、コンシューマーに代わって再コデザインします。

9
これは貴重な記事です。ニース1
jackslash

@Stanislawは、洞察と貴重なデータに感謝します。開発者向けに自分で設計したフレームワークを作成しているので、アプリストアにアップロードするために特別なスクリプトを作成しなくても、フレームワークをそのまま使用できるようにしたいと考えています。GoogleMobileAdはそのように機能すると思います。しかし、あなたは彼らが特定のスクリプトを実行しなければならないと言いますか?GoogleMobileAdsがそれを必要としない方法を知っていますか?ありがとう
Michael A

@MichaelA、確かにそれは興味深いです。私は見てみましょう。
スタニスラフパンケビッチ2015

使用しているGoogleMobileAdsへのリンクを教えてください。
スタニスラフパンケビッチ2015

1
私の時間を節約してくれてありがとう、それは私のために働いた。Xcode 7.3、Mac OSX10.11.4。
eugen 2016

21

Carthageリポジトリのリンクされたスレッドを読むと、比較的簡単に思えます。バイナリフレームワークを配布する場合はコード署名する必要があり、カルタゴまたはココアポッドを介してソースを配布する場合は、これらのツールがさまざまな方法でこれを処理するため、そうしません。

バイナリフレームワークを配布するときにコード署名する必要がある理由は、Xcodeがコード署名なしでフレームワークバイナリを生成しないためです。バイナリフレームワークをコード署名しないようにしようとすると、次のエラーが発生します。

CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'

ご指摘のとおり、フレームワークは「コードサインオンコピー」設定で再設計されるため、どのIDでフレームワークに署名するか(iPhoneDeveloperまたはiPhoneDistribution)は関係ありません。これは、フレームワークがアプリケーションにコピーされるときに、フレームワークがフレームワークコンシューマーの開発者プロファイルからの適切な証明書によって再共同設計されることを意味します。これは、フレームワークコンシューマーからの最終的なコード署名のみが表示されるため、AppStoreに問題がないことを意味します。

結局のところ、エキゾチックなビルドプロセスを維持する必要がないので、.frameworkバイナリにコード署名することもできます。また、Xcodeは署名されたフレームワークのみを出力するため、から離れすぎないようにしてください。デフォルト。とにかく、エンドユーザーが再署名するので、それは実際には問題ではありません。


あなたの答えでは、その2番目の段落で、フレームワークは消費者によって再共同設計されるため、コードサインフレームワークは必要ないと言っています。また、95%はそれが真実であると確信していますが、わかりません。なぜ同時に最初の段落であなたが言っているのですか:「バイナリフレームワークを配布する場合はコード署名する必要があります」-違いは何ですか-バイナリフレームワークを配布する場合(つまり、カルタゴやココアポッドを介したソースではない)なぜコード署名する必要がありますか?
スタニスラフパンケビッチ2015年

使用するディストリビューションの種類(zip形式の.frameworkファイル、カルタゴ、ココアポッド)に関係なく、フレームワークをコード署名するべきではないと思います。例:次のバイナリフレームワークディストリビューションのすべてがコード署名されていません:RealmReactiveCocoaOCMockito
スタニスラフパンケビッチ2015年

ですから、「バイナリフレームワークを配布している場合は、コード署名する必要があります」と少し混乱しています。これは、他の回答と矛盾します。どうか明らかにしてください。また、私はこの賞金を「信頼できる情報源や公式の情報源からの回答を探している」として開いたことにも注意してください。
スタニスラフパンケビッチ2015年

1
はい、レルムとOCMockitoも調べました。Realmには「iPhoneDeveloper」IDがあり、そうです、OCMockitoは静的ライブラリです。私は問題を理解していると思います-コード署名されたiphoneosと共同設​​計されていないiphonesimulatorを組み合わせると、iphoneosからコード署名を削除するのはlipoです。
スタニスラフパンケビッチ2015年

1
フレームワークを配布するときに質問があります。デバッグビルドまたはリリースビルドを配布しますか?リリースビルドで配布する場合、これを行う方法は?
niczm25 2017

1

上記のスタニスラフ・パンケビッチの答えは非常に有効で正しいものです。ただし、Xcode 9.4以降、IDEはiOS Cocoa TouchFrameworkのコード署名を無効にするように要求することに注意してください。Appleはここで、.frameworkにコード署名することは推奨されないと言っています。

これがお役に立てば幸いです。


1
フレームワークへの署名に反対することを推奨するAppleの情報源はありますか?
リック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.