中年エンジニアの開発と生活の日々

中年エンジニアがソフトウェア開発や日々の生活で得た知見の備忘録

自動署名のXcodeプロジェクトをfastlaneでビルドする

自動署名とは

iOS アプリの開発においてXcode8 から導入された機能で、アプリケーションをビルド&アーカイブする際に選択した使用方法に合わせた署名をつけてくれます。 通常、署名の種類は開発用(Development)、検証用(Adhoc)、リリース用の3種類の署名があります。

自動署名機能を使用するかどうかはXcodeプロジェクトの設定ファイル(.xcodeproj)に格納されます。

自動署名で困ること

fastlane を使用して CI 環境でビルドする際にはビルドするブランチによって、使用する署名を指定する機会が多いです(例:develop ブランチなら Adhoc 用の署名をつけて、masterブランチなら Release用の署名をつけるとか )

この時にプロジェクトの設定が自動署名になっていると fastlane を使用して署名の種類を指定してビルドするとプロジェクトの設定とfastlaneの設定が食い違い、ビルドエラーになってしまいます。

解決策

自動署名機能を使わないという極端な解決策もあるのですが、せっかくの機能を使わないと勿体無いし開発者の開発効率を CI のために落とすのも本末転倒なので、以下のように運用しています。

  • fastlaneを使用してビルドを行う場合、最初にプロジェクトの設定をマニュアル署名に設定する
  • ビルド&アーカイブ処理を実行
  • ビルド&アーカイブが終わったらプロジェクトの設定を自動署名に戻す

xcodeproj ファイルは XML ファイルなので頑張れば自分で解釈して書き換えも頑張ればできるのですが、fastlaneにはプロジェクトの自動署名設定を書き換えるためのコマンドがあります。disable_automatic_code_signing と enable_automatic_code_signing です。引数にxcodeprojファイルのパスを指定して設定を変更するプロジェクトを指定します。

例えば、検証用(AdHoc)の ipa ファイルを作成する場合は以下のようになります。 xcargs の引数は各自の署名を識別できる正しい値を使用してください

  lane :beta do
    #真っ先にプロジェクトの自動署名をオフにする
    disable_automatic_code_signing(path: "XXXX.xcodeproj")
    sigh(adhoc: true)
    gym(
      clean: true, 
      workspace: 'XXXX.xcworkspace', 
      scheme: 'XXXXXX',
      configuration: 'Release',
      xcargs: "CODE_SIGN_IDENTITY='XXXX' PROVISIONING_PROFILE_SPECIFIER='XXXXXXXXXXXX'"
      ) 
    #ビルドが終わったら自動署名を元に戻す
    enable_automatic_code_signing(path: "MyApp.xcodeproj")
  end

おまけ

本来なら fastlane 側でもう少し柔軟に対応できないかとも思うのですが、今の所はこの方法で乗り切るしか無いようです。