web-dev-qa-db-ja.com

iPhoneアプリの作成時にxcodebuild内からプロビジョニングプロファイルを設定する

私はxcodebuildを使用して、コマンドラインからiPhoneアプリをコンパイルしています。プロビジョニングプロファイルを設定するための何らかのオプションを渡す方法はありますか?一般的に、xcodebuildに関する情報はあまり多くないようです。

40
Steve Klabnik

ドキュメント

ドキュメントからは、プロビジョニングファイルを設定することはできませんが、ターゲットを指定することはできます:

[-target targetname]

そのため、プロビジョニングファイルごとにターゲットを作成する場合、コマンドラインから適切なターゲットを選択できます。

これは基本的にあなたの質問を達成するでしょう。

2
Corey Floyd

実際には、XCodeコマンドライン設定に追加するだけでよいはずです。

xcodebuild [その他のオプションがある場合] PROVISIONING_PROFILE = "[プロファイルの一意のIDはこちら]"

コマンドラインからのビルド設定はすべてをオーバーライドすることになっているため、プロジェクトまたはターゲットで定義されたものよりも勝つはずです。

82
Rob

私の解決策はエレガントではありませんが、それは仕事をし、ビルドサーバー上のすべてを自動化させます:

#!/bin/bash

TARGET="Your App"
CONFIGURATION="Release"
SDK="iphoneos"
PROFILE_PATH="/Users/jkp/Desktop/foo.mobileprovision"
IDENTITY="iPhone Distribution: Your Company Ltd"
KEYCHAIN="/Users/jkp/Desktop/keychain"
PASSWORD="foobar"

open "${PROFILE_PATH}"
sleep 5
osascript -e "tell application \"Xcode\" to quit"
security unlock-keychain -p ${PASSWORD} ${KEYCHAIN}
xcodebuild \
  -target "${TARGET}" \
  -configuration ${CONFIGURATION} \
  -sdk iphoneos \
  CODE_SIGN_IDENTITY="${IDENTITY}" \    
  OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}"

ここで重要なことは、最初にプロビジョニングプロファイルをインストールする必要がなかったことです。実際、mechanizeを使用して各ビルドの前にプロビジョニングプロファイルの最新のコピーをダウンロードする別のスクリプトがあります。つまり、プロファイルをリモートで更新(たとえば、新しいデバイスを追加)し、CIサーバーが追加の作業なしでそれらの変更を取得できることを意味します。

注:それ以来、Xcodeをまったく使用せずにプロビジョニングプロファイルをインストールまたは更新する方法を見つけました。詳細については here を参照してください。

27
jkp

プロビジョニングプロファイルはUUIDで提供する必要があります。私の場合、プロビジョニングプロファイルはソース管理システムにチェックインされるため、開発者/ビルドサーバー/ CIシステムによってコードでチェックアウトされます。ソースツリーでは、プロファイルはMyApp.mobileprovisonなどの人間が読める名前を持ち、「ProvisioningProfiles」というディレクトリにあります。 xcodeアーカイブを作成するには、xcodebuildがプロファイルを認識する前に、プロファイルの名前を変更して〜/ Library/MobileDevice/Provisioning Profilesディレクトリにコピーする必要があります。これは、CIビルドスクリプトで使用できるコードスニペットです。

# The keychain needs to be unlocked for signing, which requires the keychain
# password. This is stored in a file in the build account only accessible to
# the build account user
if [ ! -f $HOME/.pass ] ; then
    echo "no keychain password file available"
    exit 1
fi

case `stat -L -f "%p" $HOME/.pass`
in
    *400) ;;
    *)
        echo "keychain password file permissions are not restrictive enough"
        echo "chmod 400 $HOME/.pass"
        exit 1
        ;;
esac

#
# unlock the keychain, automatically lock keychain on script exit
#
security unlock-keychain -p `cat $HOME/.pass` $HOME/Library/Keychains/login.keychain
trap "security lock-keychain $HOME/Library/Keychains/login.keychain" EXIT

#
# Extract the profile UUID from the checked in Provisioning Profile.
#
uuid=`/usr/libexec/plistbuddy -c Print:UUID /dev/stdin <<< \
        \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``

#
# Copy the profile to the location XCode expects to find it and start the build,
# specifying which profile and signing identity to use for the archived app
#
cp -f ProvisioningProfiles/MyApp.mobileprovision \
        "$HOME/Library/MobileDevice/Provisioning Profiles/$uuid.mobileprovision"
xcodebuild -workspace MyApp.xcworkspace -scheme MyScheme \
        -archivePath build/MyApp.xcarchive archive \
        PROVISIONING_PROFILE="$uuid" CODE_SIGN_IDENTITY="iOS Distribution"

キーチェーンのロックを解除し、「/ usr/bin/codesign」ツールが署名IDに関連付けられた秘密キーへのアクセスを許可する必要があります。これは、次の参照が使用されました https://stackoverflow.com/ a/21327591/2351246 および Keychainなしで秘密鍵ACLにcodesignを追加 codesignのロック解除およびキーチェーンアクセスの追加.

その後、アーカイブをxcodebuildを使用してIPAにエクスポートする場合、次の問題を考慮する必要があります( xcodebuildは.appからファイルをコピーしません )。プロビジョニングプロファイルを再度指定する必要があります。 IPAを作成するスクリプトスニペットは

profileName=`/usr/libexec/plistbuddy -c Print:Name /dev/stdin <<< \
        \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``

xcodebuild \
        -exportArchive \
        -exportFormat IPA \
        -archivePath build/MyApp.xcarchive \
        -exportPath $IPADIR/MyApp.ipa \
        -exportProvisioningProfile "$profileName"

このコマンドの実行中は、キーチェーンのロックを解除する必要があります。

更新

OSX Mavericks(v10.9.5)およびOSX Yosemiteでは、コード署名エラーが発生し始めました:

Codesign check fails : ...../MyApp.app: resource envelope is obsolete

原因については、この投稿を確認してください xcodebuild-codesign -vvvv says "リソースエンベロープis obsolete"

参照された投稿でApple Supportによって提案された変更を実装するには、次のコマンドを実行します。

 Sudo Perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
21
BitByteDog

これはおそらくOPトピックから少し外れていると思いますが、Jenkinsで動作するXcodeビルドを取得する方法を検索するときに、この質問が最初に出てきます。後世のためにここに追加情報を投稿します。そしてポイント。これが便利だと思ったら、ポイントを教えてください:)

とにかく、最近数回このラウンドを数回行った。これを見つけました:

http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html

動作しているようです。確認してください:

  1. 最初にXcodeビルドを通常のOSXユーザーとしてセットアップします。そこから配布可能ファイルを構築し、Xcodeを介してプロビジョニングプロファイルの問題を修正します。

  2. 通常のOSXユーザーとして、xcodebuildを使用してコマンドラインビルドを機能させます。

  3. 次に、上記の投稿の指示に従ってレターにアクセスし、すべてのiOS証明書をログインキーチェーンからシステムにコピーし、~/Library/MobileDevice/Provisioning Profiles Jenkinsユーザーの~jenkins/Library/MobileDevice/Provisioning Profilesフォルダー。

上記のステップ2のコマンドを使用した次のJenkinsビルドは問題なく動作するはずです。

4
Tim Fulmer