私のシナリオ
クライアント用のiOSアプリを作成しました。このプロジェクトはもうすぐ終わり、今はApp Storeに置く時です。開発プロセス全体を通して開発ビルドを送信しています。これらのビルドには、私の会社とクライアントのプロジェクトに基づくcom.mycompany.clientname.projectname
というバンドルIDがありました。私は、自分のプロビジョニングポータルアカウントで作成したアドホック配布プロビジョニングプロファイルを使用して、それらのアドホックビルドに署名しました。
App Storeにアクセスするときがきたので、リリースビルドを実行し、それを送信して独自のApp Storeディストリビューションプロビジョニングプロファイルで署名する必要があります。これは、プロジェクトに新しいバンドルIDを設定することも意味します。
私の問題
プロビジョニングプロファイルを使用して署名するために、クライアントにコンパイル済みアプリを取得する必要があります。ただし、最初に使用するバンドルIDを設定する必要があります。 com.bestclientever.appname
だとしましょう。 Xcode 4では、コード署名が必要なため、プロジェクトをアーカイブできません。プロビジョニングポータルで設定したものと同じバンドルIDでプロビジョニングプロファイルを作成できないため、コード署名できません(プロビジョニングポータルは一意性を強制します-必要に応じて)。
ここで間違った仮定や誤解をしましたか?すなわち。バンドルIDを署名するものに本当に設定する必要がありますか?
質問
コード署名せずにiOSアプリをアーカイブする、またはビルドする方法はありますか? 「後で署名する」設定などですか?
または、1つのバンドルIDでアプリをビルドする方法がありますが、他の誰かが別のバンドルIDのプロビジョニングプロファイルで署名することができます(コンパイルされたアプリのバンドルIDまたは他の署名方法のいずれかによって)?
最終リリースビルドをビルドするが、App Storeに配布するために他の誰かにアプリに署名させるにはどうすればよいですか?
私が試したことや検討したこと
これらの答えのほとんどは複雑で時代遅れのようです。簡単な答えは、開発者プロファイルでアーカイブを作成することだと思います。
これは現在、私自身の目的のために調査中のソリューションです(完全にはテストされていません):
アカウントへの開発者アクセス(チームエージェントではない)が必要であり、指定されたApp IDのビルドを許可する開発プロビジョニングプロファイルを作成します(App IDはコンパイルされるため、指定する必要があります)。次に、開発プロファイルでアプリをアーカイブし、クライアントとアーカイブを共有します。その後、独自の配布プロファイルでアーカイブに再署名できます。
複雑な点の1つは、開発者プロファイルを使用してアーカイブを構築すると、資格属性get-task-allowがtrueに設定されますが、配布のためにfalseに設定する必要があるため、手動で資格を設定して回避する必要があることです.plist-ここに私の質問を参照してください: 開発者証明書でアーカイブし、配布証明書で送信中に再署名できますか?
WWDC 2012で、次の手法が機能することを確認しました。クライアントの関与が少ない、クライアントの専門知識が少ない、シンプルな署名プロセス、およびソースコードの所有権という制約を最もよく満たします。
これには、クライアントがdeveloper.Apple.comのメンバーセンターを使用し、Xcodeを少し使用する必要があります(ただし、オーガナイザーだけです!)。クライアントがこのレベルで技術的な機能の問題を抱えている場合は、引き継いでそれを行うことをお勧めします(そして料金を請求します!)。開発者のログインとパスワードを要求し、あなたが従業員であるかのように彼らに代わって行動するだけです。
Ed note:キーを取引することはひどい妥協です。なぜなら、それはクライアントにとってより技術的で複雑であり、開発者にとってよりハック的で危険なためです。これらの2つのより良いオプションを考えると、それは非オプションと考えられるべきです。
同じ問題がありました。これは私が最終的にそれを解決した方法でした:
クライアントは、配布証明書を共有するので、development証明書の共有にはあまり関心がありませんでした。
また、「デバッグ可能」(get-task-allow)をNOに設定してentitlements.plist
を作成し、ビルド構成で参照する必要がありました(コード署名、コード署名資格の下)。
私はあなたが望むことを正確に行う方法を見つけたと信じています、私は広範なテストを行っていないか、アプリストアにアップロードしようとしましたが、私が行ったテストからは良いようです。プロビジョニングプロファイルの辞任と追加は、手動プロファイルインストールを必要とせずにAdHocプロファイルで定義されたデバイスにインストールできるため、機能しています。 2番目のテストは、xCodeから同じバンドルIDを持つiPadとiPhoneバージョンのアプリを入手したことです。最初は両方をiTunesに含めることはできませんでしたが、辞任とバンドルIDの変更後に両方をインストールすることができました。また、アプリ名を変更してみましたが、それも機能し、デバイスとiTunesに新しい名前で表示されました。以下は私のスクリプトです。特定のアプリを辞任するように設計されているため、プロファイルとbundleIDはハードコードされています。 iPhoneとiPadバージョンのアプリを切り替えて、スクリプトのパラメーターとして追加しました。しかし、あなたは私がここに持っている原則を取り、あなた自身のためにそれらを洗練することができるはずです。
この基本は、 DanのDev DiaryからiOSを辞任するさらなる冒険 のような記事と、上記のErica SadunのApp Signerに非常に似ています。私が行った主な追加は、辞任前のInfo.plistの編集でした。
#!/bin/sh
DestFile="Signed_$1"
SigningCertName="YOUR DISTROBUTION CERT NAME HERE FROM KEYCHAIN"
AppInternalName="APP NAME FROM INSIDE PAYLOAD FOLDER.app"
echo
echo "Going to take the app $1 and resign it as $DestFile"
echo
if [ "$2" = "iphone" ] ; then
echo "Using iPhone Profile"
echo
BundleID="com.YOURCOMPANY"
ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE.mobileprovision"
Elif [ "$2" = "ipad" ] ; then
echo "Using iPad Profile"
echo
BundleID="com.YOURCOMPANY.ipad"
ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE_iPad.mobileprovision"
else
echo "You must enter either iphone or ipad as the second parameter to choose the profile to sign with."
echo
exit 1
fi
rm -f Resigned.ipa
unzip -q $1 -d temparea
cd temparea/Payload
echo "*** Original Signing ***"
echo "************************"
codesign -d -vv $AppInternalName/
cp "$ProvProfile" ./$AppInternalName/embedded.mobileprovision
export EMBEDDED_PROFILE_NAME=embedded.mobileprovision
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
#Update the Info.plist with the new Bundle ID
sed 's/>ORIGINAL BUNDLEID HERE</>'$BundleID'</' ./$AppInternalName/Info.plist >./$AppInternalName/Info.plist.new
mv -f ./$AppInternalName/Info.plist.new ./$AppInternalName/Info.plist
# this will do a rename of the app if needed
# sed 's/>ORIGINAL APP NAME</>NEW APP NAME</' ./$AppInternalName/Info.plist >./$AppInternalName/Info.plist.new
# mv -f ./$AppInternalName/Info.plist.new ./$AppInternalName/Info.plist
# echo "Hit enter to proceed with signing."
# read TMP
codesign -f -vv -s "$SigningCertName" -i $BundleID $AppInternalName
echo
echo "*** New Signing ***"
echo "*******************"
codesign -d -vv $AppInternalName/
cd ..
Zip -r -q ../Resigned.Zip .
cd ..
rm -R temparea
mv Resigned.Zip $DestFile
echo
echo "New IPA Created, $DestFile"
最良の代替方法は、クライアントに配布証明書の秘密キーを.p12ファイルにエクスポートして、クライアント用のApp Store配布ビルドを生成できる配布プロファイルとともに送信することです。
幸運を祈ります!!
よろしく、サム
iResign は非常にうまく機能します。
署名時にバンドルIDを変更し、資格を追加できます。おそらくあなたのユースケースで動作します。
とはいえ、xcarchiveソリューションはより標準的です。 xcarchiveファイルを共有すると、dsymが提供されることに注意してください。
コードに#ifdef DEBUGステートメントがある場合は、指定したビルドでそれらが無効になっていることを確認してください。
ええと、これらはすべて、彼らがしなければならないよりも複雑に見えます。私はこれをこれを使用します:
xcodebuild -scheme "$SCHEME" clean archive \
-archivePath "build/$SCHEME" \
-workspace $PRODUCT_NAME.xcworkspace \
-allowProvisioningUpdates \
-configuration Release \
PRODUCT_NAME="$SCHEME" \
PRODUCT_BUNDLE_IDENTIFIER="$BUNDLE_ID" \
EXECUTABLE_NAME="$SCHEME" \
DISPLAY_NAME="$DISPLAY_NAME" \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_ENTITLEMENTS="" \
CODE_SIGNING_ALLOWED=YES
OK、それを行う方法を見つけましたプロビジョニングプロファイルまたは証明書を共有せずに。
「スクリプトを実行する」ビルドフェーズを挿入して、XCodeをコンパイルしてアプリに署名させ、コンパイル済み(署名なし)アプリをクライアントに送信してから、XCodeが証明書とプロフィール。
方法:
ステップ1:XCodeに署名のないRelease .appを生成させます(これを「App A」と呼びます)。こちらの「コード署名を無効にするには」を参照してください。 https://stackoverflow.com/a/10171462/375486
ステップ2:新しいXCode iOSプロジェクトを作成し、可能なすべてのビルドフェーズを削除して、空の.appファイルを作成します(これを「App B」と呼びます)
ステップ:「App A」の内容を「App B」にコピーする「スクリプトを実行」ビルドフェーズをプロジェクトBに追加します。私の場合、これを使用しました:
cp -r A.app/* "$CODESIGNING_FOLDER_PATH"
ステップ4:すべての必要なファイルとともに、「B」XCodeプロジェクトをクライアントに送信します。
ステップ5:クライアントはBプロジェクトをビルドします。内部では、XCodeは「スクリプトを実行」コマンドを実行し、結果のアプリに署名します。クライアントは完全に署名されたアプリを取得します。
以上です :)
私はそこに行ったことがある。オプション2または3は問題外です。オプション4は理想的ですが、あなたが書いたように、Appleは、エージェントが配布プロファイルを作成する特権を委任することを許可しません。
したがって、基本的に、唯一のオプションは、アカウントで定義された配布プロファイルを取得することです。それを処理するには、エージェントとしてログインする必要がありますが、これはオプションではありません。
theyはそれをしなければなりません。それを回避する方法はありません。
また、彼らはあなたのアカウントで彼らの製品開発チームのメンバーとしてあなたを招待しなければなりません。管理者である必要があります。つまり、Appleによって概説されているように、署名証明書リクエストを送信する必要があります。
最後に、作成した配布プロビジョニングプロファイルをダウンロードして送信する必要があります。
これらすべてにより、リソースを使用してアプリケーションに署名できるようになります。
Appleと電話を切ったところです。彼らは、これがそれを行う唯一の方法だと言っています: https://developer.Apple.com/library/ios/#qa/qa1763/_index.html
クライアントはあなたをチームに追加し、特定の特権を与えます。