アプリの複数の同時ビルドをビルドしようとしています (モック環境用、開発環境用、テスト環境用、本番リリース用)。
私はこれを機能させるのに非常に苦労しましたが、自動生成されたバンドル識別子 (変数から実行されるもの) を使用したアプリのコード署名に問題があります。
これまでに行ったこと
アドホック プロビジョニング プロファイルを使用して xCode 4.6.3 を使用しています。
これを機能させるために、info plist ファイルでバンドル ID を設定して、変数をいくらか実行するようにしています。これにより、アプリはさまざまな方法で署名できるようになります。たとえば、私の実際のバンドル識別子は次のとおりです。
- UXXXXXX.au.com.blah.MOCK
- UXXXXXX.au.com.blah.DEV
- UXXXXXX.au.com.blah.TEST
- UXXXXXX.au.com.blah.PROD
したがって、情報 plist のバンドル識別子は「UXXXXXX.au.com.blah.${BUNDLE_SUFFIX}」として構成されています。
ビルドごとに異なる方法でアプリをビルドできるようにするために、次のことを行いました。
- 4 つの異なるバンドル ID があり、それらのバンドル ID に割り当てられた 4 つの異なるプロビジョニング プロファイルがあります
- まず、「MOCK」という新しい構成を追加しました(後で他の構成を追加します)
- 次に、プロジェクトのビルド設定の下で、BUNDLE_SUFFIX ユーザー定義変数をプロジェクトに追加し、MOCK 構成の MOCK に設定しました (後で他の変数を追加します)。これは、MOCK 構成を使用するビルドのバンドル識別子を設定するために使用されます。
- 次に、プロジェクトのビルド設定の下で、ビルド設定の MOCK 構成の MOCK プロビジョニング プロファイルを選択しました。
- アプリ ターゲットの概要ビューに移動すると、バンドル ID が UXXXXXX.au.com.blah.MOCK として表示され、「MOCK」部分が灰色のフォントで表示されることに気付きました。つまり、バンドル サフィックス変数が選択されています。
- 次に、「プロファイル」と「アーカイブ」にMOCK構成を使用するために、MOCKと呼ばれる新しいスキームを作成しました。残りはデフォルトのままにしました (DEBUG を使用)。
これで、xcodebuild を実行し、スキーム MOCK を使用して、MOCK 構成を使用してバンドル識別子を .MOCK に設定し、プロビジョニング プロファイルを _MOCK プロファイルを使用するように設定する MOCK 固有のビルドを実行できます。
次に、xcodebuild と xcrun (codesign を呼び出す) を実行する jenkins ビルドを実行します。
これは私の xcodebuild コマンドです:
/usr/bin/xcodebuild -scheme MOCK -sdk iphoneos -project MyApp.xcodeproj -configuration MOCK clean build "CONFIGURATION_BUILD_DIR=/Users/CI/Documents/workspace/build3" ONLY_ACTIVE_ARCH=NO DEPLOY_ENVIRONMENT=MOCK "CODE_SIGN_IDENTITY=iPhone Distribution: My Company" "PROVISIONING_PROFILE=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
これは私の xcrun コマンドです:
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "/Users/Shared/Jenkins/Home/jobs/MyApp.app" -o "/Users/Shared/Jenkins/Home/jobs/MyApp/workspace/build/MyApp-0.9.5.0.ipa" --embed "/Users/Shared/Jenkins/Home/Library/MobileDevice/Provisioning Profiles/20130816_Distribution_MOCK.mobileprovision" --sign "iPhone Distribution: My Company"
注: アプリはプッシュ通知を使用し、.* を使用してアプリをビルドしてから再署名すると、.* プロファイルを使用してアプリに署名できないことが判明したため、MOCK プロビジョニング プロファイルを使用してアプリに具体的に署名します。適切なプロファイルを持つアプリ、私の embedded.mobileprovision プロファイルは更新されますが、.app ファイル内の実際の実行可能ファイルは更新されません。これにより、プッシュ通知がデバイスに届かなくなります。したがって、私が作業する必要があるのは、変数を使用して動的に入力されるバンドル ID を持つアプリを使用して、コマンド ラインからアプリをビルドして署名する機能です。そして、私はこれを機能させることができないようです。
結果
xcodebuild は正常に実行され、完全に機能します。アプリは .MOCK として適切にビルドおよび署名され、_MOCK プロビジョニング プロファイルを使用しているようです。
しかし!IPA ファイルの生成に問題があります。コードサインに問題があります。
コード署名資格なしでアプリを作成したことに注意してください。codesign は次のエラーを表示します: 警告: アプリケーションは codesign 検証に失敗しました。署名が無効であったか、許可されていない権限が含まれているか、iPhone 配布証明書で署名されていませんでした。(-19011) Executable=/Users/CI/Documents/workspace/build3/MyApp.app/MyApp codesign_wrapper-4.1: プロファイル評価に Apple CA を使用 無効な資格キー/値のペア: アプリケーション識別子、UXXXXXX.au.com.blah . AssertMacros: filter_entitlements(entitlements_whitelist, entitlements_requested, allowable_entitlements), ファイル: codesign_wrapper.c, 行: 932 - (null
bundle_suffix が取得されていないことに注意してください。また、コードサインが参照する MyApp.xcent ファイルを表示すると、UXXXXXX.au.com.blah が含まれていることがわかります。初期化。bundle_suffix の値が取得されていません。
それで、私が試したのは、MOCKビルド構成用のentitlements.plistファイルを作成し、ビルド設定の下のMOCK構成の「コード署名資格」の下にファイルへのリンクを追加することです。しかし、今では別のエラーが発生し、かなり気がかりです:
/usr/bin/codesign --force --sign 5XXXXXXXXXXXXXXXXXXX2c --resource-rules=/Users/CI/Documents/workspace/build3/MyApp.app/ResourceRules.plist --entitlements /Users/CI/Library/Developer/Xcode/DerivedData/MyApp-fasiktlyysoxjpgalujkfjpyiyeo/Build/Intermediates/MyApp.build/MOCK-iphoneos/MyApp.build/MyApp.xcent /Users/CI/Documents/workspace/build3/MyApp.app
/Users/CI/Documents/workspace/build3/MyApp.app cd /Users/Shared/Jenkins/Home/jobs/MyApp-MOCK-HourlyBuilds/workspace setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/を検証しますiPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr /local/git/bin" setenv PRODUCT_TYPE com.apple.product-type.application /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/Validation /Users/CI/Documents/workspace /build3/MyApp.app 警告: このバンドルは無効です。アプリケーション ID 資格が正しくフォーマットされていません。10 文字のアプリ ID シード、ドット、バンドル ID が含まれている必要があります: UXXXXXXXX.au.com.amp.blah.MOCK (-19054) アプリケーションを検証できません。- (ヌル)
今回は実際に適切なバンドル識別子をピックアップしました!! それはそれをMOCKと言います。しかし、このバンドルが無効であると不平を言っています...しかし、私には完全に有効に見えます!! なぜ機能しないのですか?
これは、手動で作成してプロジェクトに追加した entitlements.plist ファイルです (「コード署名資格」で参照)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>UXXXXXXXXXXX.au.com.amp.blah.MOCK</string>
<key>aps-environment</key>
<string>production</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>UXXXXXXXXXXX.au.com.amp.blah.MOCK</string>
</array>
</dict>
</plist>
どんな助けでも大歓迎です、どうもありがとう!
PS この問題を回避する方法は、ビルドごとに異なるターゲットを作成することです。しかし、複数のターゲットを維持するのは面倒なので、私は本当にこれを望んでいません。できれば、複数のターゲットを持たずにこれをやり遂げたかったのです。
PSS この問題を回避する別の方法は、最初に .* プロビジョニング プロファイルでアプリに署名し、その後適切なプロファイルでアプリを辞任することですが、これはうまくいきません。.app 内の実行可能ファイルは、.* プロビジョニング プロファイルへの参照を引き続き保持するためです。したがって、このデバイスではプッシュ通知を受け取ることはできません。「アプリケーションの有効な 'aps-environment' 資格文字列が見つかりません」というエラーが表示されます。