酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xcode 8.3.1でAutomatically manage signingが有効になっているプロジェクトの場合にipaファイルが出力できない

Xcode 8.3以降でAutomatically manage signingが有効になっているプロジェクトで、コマンドライン(xcodebuild)を使ってipaファイルを作成することができず、途中でビルドエラーが発生してしまう問題にぶち当たりました。

f:id:ch3cooh393:20170419120113p:plain

個人的な感想としては、Xcode 8.3でxcrun PackageApplicationが使えなくなったのが全部悪い!(暴言)

開発環境について

  • Xcode 8.3.1
  • 僕のアカウントのRoleはDeveloper (たぶん)

以前の失敗例

少し前にxcrun PackageApplicationが使えなくなりビルドに失敗するようになってしまいました。その際の解決方法については以下の記事で書きました。

この記事でビルドしていた時のプロジェクトは、Automatically manage signingを無効にしているプロジェクトだったので意識しませんでしたが、Automatically manage signingを有効にしている場合に外部から証明書やProvisioning Profileを指定するとコンフリクトを起こして失敗してしまいます。

MyApplication has conflicting provisioning settings. MyApplication is automatically signed, but provisioning profile iOS Team Provisioning Profile: jp.ch3cooh.MyApplication has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the project editor.

Automatically manage signingが有効になっているプロジェクトでipaファイルが出力できなくなってしまった

いつもの手順。

  1. xcodebuildで.xcarchiveを作成
  2. .xcarchiveをipaでエクスポートする
  3. ダウンロードページを作成
  4. S3にアップロード

いまの状態

  1. xcodebuildで.xcarchiveを作成
  2. .xcarchiveをipaでエクスポートする (失敗)

.xcarchiveをipaでエクスポートに失敗する

.xcarchiveまで作ってしまえば、通常は下記のコマンドでipaファイルが出力されます。

xcodebuild -exportArchive \
  -archivePath /PATH/myapplication.xcarchiv \
  -exportPath PATH \
  -exportOptionsPlist /PATH/exportOptions.plist

2.の手順でコマンドライン上で表示される失敗理由は、

No provisioning profiles matching an applicable signing identity were found.

.xcarchive は手動でもipaをエクスポートすることができるので、手動でやってみると下図のようなエラーが発生しています。

f:id:ch3cooh393:20170419120944p:plain

exportOptions.plistのmethodをdevelopmentに変更するとエクスポートはできる

exportOptions.plistのmethodを'development'に変更するとエクスポートはできた。

仮説と対策

仮説を立ててみた。

Xcode 8.2まではAutomatically manage signingが有効でも証明書とppを明示的に指定することでipaファイルを生成することができた*1

Xcode 8.3からはコマンドラインでipaファイルを生成する際には、xcarciveからipaをエクスポートする必要があるが、Automatically manage signingを有効にしていると(必要なppがインストールされていたとしても)ログインしているアカウントのroleに依存してしまう。Distribution用のppは、ユーザーのRoleがAdmin以上でなければいけない。

仮に対策を考えてみた。

  1. ログインユーザーのroleをadminにする
  2. エクスポートしたipaのppを差し替えて強制的に署名してしまう

1.は対策としては簡単だけど、受託案件の場合、お客さまからアカウントを発行してもらうのが常でroleはdeveloperで、Adminはもらえなさそう。

2.がいいかもしれない。

解決編

CI用にAdminに昇格してもらった。

関連記事

xcodebuildについての関連記事はこちらでも確認することができます。

*1:というよりもxcrun PackageApplicationがよしなにしてくれていた