想定するケース
GUIのない環境下でiOSアプリをコマンドラインでビルドするケースを想定しています。例えばJenkinsとか。
キーチェーンに証明書の鍵をimportしたのに動かない!というケースへの対応です。
xcodebuildでビルドしているときに
/usr/bin/codesign --force --sign <キーチェーンのUUID> --resource-rules= …中略…
User interaction is not allowed.
The following build commands failed:
CodeSign <アプリ名>
というエラーが出るときの対応です。
原因
キーチェーンに含まれている秘密鍵を利用しようとするとキーチェーンがポップアップを表示して秘密鍵を利用してもいいかを尋ねます。
GUI環境のある場合は、
codesignはキーチェーンに含まれるキー "your-key-name"を使用して
署名しようとしています。
この項目へのアクセスを許可しますか?
というダイアログが出るのですが、Jenkinsのようなコマンドライン環境ではポップアップが出せないため "User interaction is not allowed."というエラーが出て失敗します。
どうすればよいか
- 署名用秘密鍵をimportするときに /usr/bin/codesign にアクセス権限を与える
- ビルドする際にkeychainのパスフレーズを入力するポップアップが出ないようにする
署名用秘密のimport
GUIからでもimportはできますが、その場合特定のプログラムに対してアクセスを与えるのが面倒です。
以下のようにコマンドで実行します。
$ security unlock-keychain -p <キーチェーンのパスフレーズ>
$ security import <秘密鍵のパス> -k ~/Library/Keychains/login.keychain -P <キーチェーンパスワード> -T /usr/bin/codesign
まず、unlock-keychain
でキーチェーンをunlockします。これをしないと次のコマンド実行時に"User interaction is not allowed."というエラーが出て失敗します。
次に security import...
で秘密鍵をキーチェーンにimportします。ただしその時、-T /usr/bin/codesign
で秘密鍵にアクセスできるプログラムを渡します。
xcodebuildでビルドするとき、内部では/usr/bin/codesign
を利用しているようなのでこのプログラムにアクセス権限を与えます。
ビルドスクリプト
初めの方に
$ security unlock-keychain -p <キーチェーンのパスフレーズ>
としてキーチェーンをアンロックしてください。そうしないとビルドするときにキーチェーンパスワードを求めるポップアップが出現します。
合わせて読みたい
iOSアプリのプロビジョニング周りを図にしてみる
ssh - "User interaction is not allowed" trying to sign an OSX app using codesign - Stack Overflow