web-dev-qa-db-ja.com

クライアントが終了時に署名できるiOSリリースビルドを作成するにはどうすればよいですか?

私のシナリオ

クライアント用の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に配布するために他の誰かにアプリに署名させるにはどうすればよいですか?

私が試したことや検討したこと

  • クライアントのために行動する。
    • 他のあまり知識のないクライアントでは、Provisioning PortalとiTunesConnectの資格情報を取得し、最終的なビルドをそのまま実行しました。それはこのクライアントでは飛ぶことはありません。これは、厳格なセキュリティガイドラインと多くの赤字を抱える大企業です。
  • クライアントとしてのなりすまし。
    • これは上記のものと類似しており、同じ理由で機能しません。私のクライアントに「あなたのprivateキーをエクスポートして送ってくれませんか」と聞くのは本当にうんざりしているように聞こえますか?この手法については、この回答で説明されています: iOSアプリをクライアントに送信し、コード署名を行うには
  • クライアントにプロジェクトのソースコードを送信し、リリースビルドを任せる。
    • ソースコードのライセンスは、私たちの同意ではありませんでした。さらに、このクライアントはソースコードに関与することを望んでいません(そのため、アウトソーシングしています)。私はこれを最後の手段として楽しませるでしょうが、もっと良い方法があります!
  • デベロッパーメンバーセンターで管理者レベルのデベロッパーとして設定する。
    • 残念ながら、エージェントレベルのユーザーのみがプロビジョニングプロファイルを作成できます(私が知る限り)。ビルドに署名するために使用できるプロファイルを作成する方法、またはプロファイルを生成する方法があるはずです。どちらのオプションも見つかりません。
64
RickDT

これらの答えのほとんどは複雑で時代遅れのようです。簡単な答えは、開発者プロファイルでアーカイブを作成することだと思います

これは現在、私自身の目的のために調査中のソリューションです(完全にはテストされていません):

アカウントへの開発者アクセス(チームエージェントではない)が必要であり、指定されたApp IDのビルドを許可する開発プロビジョニングプロファイルを作成します(App IDはコンパイルされるため、指定する必要があります)。次に、開発プロファイルでアプリをアーカイブし、クライアントとアーカイブを共有します。その後、独自の配布プロファイルでアーカイブに再署名できます。

複雑な点の1つは、開発者プロファイルを使用してアーカイブを構築すると、資格属性get-task-allowがtrueに設定されますが、配布のためにfalseに設定する必要があるため、手動で資格を設定して回避する必要があることです.plist-ここに私の質問を参照してください: 開発者証明書でアーカイブし、配布証明書で送信中に再署名できますか?

27
Richard Venable

WWDC 2012で、次の手法が機能することを確認しました。クライアントの関与が少ない、クライアントの専門知識が少ない、シンプルな署名プロセス、およびソースコードの所有権という制約を最もよく満たします。

  1. クライアントは、開発者をAdminとしてメンバーセンターのチームに招待します。
  2. 開発者は招待を受け入れます(メールに記載する必要があります)
  3. 開発者はXcodeのオーガナイザー->デバイスタブ->プロビジョニングプロファイルを開き、右下隅にある[更新]をクリックします。適切なチームを選択し、いくつかの新しいアイテムを取得する必要があります。
  4. Xcodeで、コード署名ID設定をデフォルト値のままにします(またはiOS SDK for iPhone Developerにリセットします)。
  5. アプリをアーカイブする
  6. オーガナイザーで、アーカイブを右クリックし、「Finderで表示」を選択します
  7. .xcarchiveファイルをクライアントに送信します
  8. クライアントにはXcodeがインストールされている必要があります
  9. クライアントは、オーガナイザーで開く必要がある.xcarchiveファイルをダブルクリックします
  10. クライアントが[配布]をクリックして、自分のIDでアプリに署名します。
  11. 利益

これには、クライアントがdeveloper.Apple.comのメンバーセンターを使用し、Xcodeを少し使用する必要があります(ただし、オーガナイザーだけです!)。クライアントがこのレベルで技術的な機能の問題を抱えている場合は、引き継いでそれを行うことをお勧めします(そして料金を請求します!)。開発者のログインとパスワードを要求し、あなたが従業員であるかのように彼らに代わって行動するだけです。

Ed note:キーを取引することはひどい妥協です。なぜなら、それはクライアントにとってより技術的で複雑であり、開発者にとってよりハック的で危険なためです。これらの2つのより良いオプションを考えると、それは非オプションと考えられるべきです。

27
RickDT

同じ問題がありました。これは私が最終的にそれを解決した方法でした:

  1. クライアントがdevelopment証明書を作成しました。
  2. クライアントは、配布プロビジョニングファイルと同じApp IDを使用してdevelopmentプロビジョニングファイルを作成しました。
  3. クライアントは開発証明書(.p12)をエクスポートしました。
  4. クライアントから.p12ファイルと開発用モバイルプロビジョニングファイルが送られてきました。
  5. クライアントp12ファイルをキーチェーンにインポートしました
  6. クライアントのプロビジョニングファイルをXcodeにインポートしました。
  7. ビルド構成のコード署名IDを設定して、クライアントのプロビジョニングファイルを使用します。
  8. アプリをアーカイブしました。
  9. クライアントにアーカイブを送信しました。
  10. クライアントは、distributionプロビジョニングファイルでアプリに署名することにより、ディストリビューションビルドを作成しました。 (テスト用にアプリを内部で配布していました。)

クライアントは、配布証明書を共有するので、development証明書の共有にはあまり関心がありませんでした。

また、「デバッグ可能」(get-task-allow)をNOに設定してentitlements.plistを作成し、ビルド構成で参照する必要がありました(コード署名、コード署名資格の下)。

6
jimmyg

私はあなたが望むことを正確に行う方法を見つけたと信じています、私は広範なテストを行っていないか、アプリストアにアップロードしようとしましたが、私が行ったテストからは良いようです。プロビジョニングプロファイルの辞任と追加は、手動プロファイルインストールを必要とせずに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"
3
Piwaf

最良の代替方法は、クライアントに配布証明書の秘密キーを.p12ファイルにエクスポートして、クライアント用のApp Store配布ビルドを生成できる配布プロファイルとともに送信することです。

幸運を祈ります!!

よろしく、サム

2

iResign は非常にうまく機能します。

署名時にバンドルIDを変更し、資格を追加できます。おそらくあなたのユースケースで動作します。

とはいえ、xcarchiveソリューションはより標準的です。 xcarchiveファイルを共有すると、dsymが提供されることに注意してください。

コードに#ifdef DEBUGステートメントがある場合は、指定したビルドでそれらが無効になっていることを確認してください。

1
funroll

ええと、これらはすべて、彼らがしなければならないよりも複雑に見えます。私はこれをこれを使用します:

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
1
Popmedic

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は「スクリプトを実行」コマンドを実行し、結果のアプリに署名します。クライアントは完全に署名されたアプリを取得します。

以上です :)

1
hasvn

私はそこに行ったことがある。オプション2または3は問題外です。オプション4は理想的ですが、あなたが書いたように、Appleは、エージェントが配布プロファイルを作成する特権を委任することを許可しません。

したがって、基本的に、唯一のオプションは、アカウントで定義された配布プロファイルを取得することです。それを処理するには、エージェントとしてログインする必要がありますが、これはオプションではありません。

theyはそれをしなければなりません。それを回避する方法はありません。

また、彼らはあなたのアカウントで彼らの製品開発チームのメンバーとしてあなたを招待しなければなりません。管理者である必要があります。つまり、Appleによって概説されているように、署名証明書リクエストを送信する必要があります。

最後に、作成した配布プロビジョニングプロファイルをダウンロードして送信する必要があります。

これらすべてにより、リソースを使用してアプリケーションに署名できるようになります。

0
Jean-Denis Muys

Appleと電話を切ったところです。彼らは、これがそれを行う唯一の方法だと言っています: https://developer.Apple.com/library/ios/#qa/qa1763/_index.html

クライアントはあなたをチームに追加し、特定の特権を与えます。

0
Joshua Smith