💨

XcodeGenの設定を変更して困ったときは、手動変更した.xcodeprojとの差分を確認しよう

2021/04/06に公開2

起きたこと

XcodeGenで管理しているプロジェクトにNotificationServiceExtension(app-extension)を追加しようとしたところ、さまざまな問題で躓いた。

  • DEVELOPMENT_TEAMの指定忘れ(code signの失敗)
  • IPHONEOS_DEPLOYMENT_TARGETの指定忘れ
  • 上記からくるアーカイブ(ipaファイル出力)の失敗
  • など

問題が起こったときにどうトラブルシューティングしたらいいかというところをこの記事でまとめる。

まとめ

XcodeGenの設定を変更して困ったときは手動での変更時との差分を確認しよう。

やったこと

少し具体的な話をすると、次のマニュアルの通りにOneSignal SDKをプロジェクトに追加しようとした。
https://documentation.onesignal.com/docs/ios-sdk-setup

このマニュアルではXcodeGen関係なく、手動でXcodeプロジェクトにNotificationServiceExtensionを追加していく方法と、SDKの追加方法が書かれている。

マニュアルの通りにNotificationServiceExtensionとSDKの追加を行った後に、ipaファイルの出力を行う場合は問題なく動作するが、XcodeGenに同様の設定を適応しようとしたところうまくいかなくて...と悩んだ。(エラーを読んだけど原因が分からなかったり、そもそもログファイルに欲しい内容が記載されていなかったりしてお手上げだった)

結果としては非常に泥臭い方法で解決した。
XcodeGenで生成した.xcodeproj > project.pbxproj(失敗する方)と、手動で設定変更を行った.xcodeproj > project.pbxproj(成功する方)の差分を見ることでうまく動作するproject.ymlが書けるようになった。

今回自分の指定が足りなかった設定値は次の通り。著名などの指定は失敗しがち。

  • DEVELOPMENT_TEAM
  • IPHONEOS_DEPLOYMENT_TARGET
  • PRODUCT_BUNDLE_IDENTIFIER

感想

手動でXcodeプロジェクトを変更すると自動でよしなにやってくれる部分が結構あるんですね。
今回の問題の本当の原因は自分がXcodeGenに不慣れなところだなとも思った。徐々に慣れていこう。

[未解決]IPHONEOS_DEPLOYMENT_TARGETの違いによってipaファイル出力の成否が別れる問題

IPHONEOS_DEPLOYMENT_TARGETを12.2以下で指定した場合、アーカイブには成功するがipaファイルの出力に失敗し、12.3以上だと成功する問題に当たっている。

こちらは未解決で、原因もわからないまま。
関係のありそうな環境まわりを書いておくので、もしお心当たりのある方はご連絡いただけると嬉しいです🙇‍♂️

  • Xcode 12.2
  • macOS Big Sur 11.0.1
  • Carthage 0.37.0
  • CocoaPods 1.10.1
  • Fastlane 2.178.0

実行したコマンドはfastlaneのbuild_ios_appコマンドで、エラーはこんな感じ。
アーカイブは成功するけど、ipaの生成に失敗してるみたい。

+ xcodebuild -exportArchive -exportOptionsPlist hoge -archivePath 'archive path' -exportPath fuga
2021-04-06 19:27:26.298 xcodebuild[22851:3781090] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path 'piyo'.
error: exportArchive: IPA processing failed

Error Domain=IDEFoundationErrorDomain Code=1 "IPA processing failed" UserInfo={NSLocalizedDescription=IPA processing failed}

** EXPORT FAILED **
ERROR [2021-04-06 19:29:08.87]: Exit status: 70

+---------------+-------------------------+
|            Build environment            |
+---------------+-------------------------+
| xcode_path    | /Applications/Xcode.app |
| gym_version   | 2.178.0                 |
| export_method | ad-hoc                  |
| sdk           | iPhoneOS14.2.sdk        |
+---------------+-------------------------+

Discussion

uhooiuhooi

私も急に同様のエラーが発生してアーカイブをエクスポートできなくなりました。
私は deploymentTarget でずっと iOS 13.0 を指定していて、特に変えていません。
xcodeVersion を Xcode 12.4 を使っているのに 12.5 に変えたくらいなので、私の場合はそれが理由かもしれません。

project.yml
options:
  bundleIdPrefix: {省略}
  deploymentTarget:
    iOS: 13.0
  xcodeVersion: "12.5"

以下の記事によると M1 Mac だと失敗すると記載されています。
https://qiita.com/kazuhidet/items/a41d1decd629c9016d0a

私は Azure Pipelines 上で実行しているので M1 Mac ではないと思うんですよね…。

uhooiuhooi

すみません他にも firebase-ios-sdk を 8.0.0 に上げて、 SwiftPM でのワークアラウンドを削除していました。
7.9.0 にダウングレードしてワークアラウンドを戻したらうまくいきました🙇‍♂️

project.yml
packages:
  Firebase:
    url: https://github.com/firebase/firebase-ios-sdk
+     version: 7.9.0
-     version: 8.0.0

schemes:
  FEEDERPlus:
    build:
      targets:
        FEEDERPlus: all
+       postActions:
+         - script: rm -rf "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Frameworks/FirebaseAnalytics.framework" &&
+                   rm -rf "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Frameworks/GoogleAppMeasurement.framework" &&
+                   rm -rf "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/PlugIns/FirebaseAnalytics.framework" &&
+                   rm -rf "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/PlugIns/GoogleAppMeasurement.framework"
+           name: Remove Firebase frameworks
+           settingsTarget: {製品ターゲット}