feather の開発環境を Xcode 14.0.1 にしたときの作業記録

先日 feather for Twitter のローカル環境と CI 環境(Jenkins)を Xcode 14.0.1 にしたのでその作業記録です。

メジャーバージョンアップだけあって色々の環境周りの変化があったもののデカ目のコードの修正は無かったです。

やったこと

環境の更新

macOS のアップデート

Xcode 14は macOS Monterey 12.5 以降が必要なので macOS が古い場合はアップデートします。

CI 環境の macOS が古かったのでアップデートを行いました。

Jenkins が壊れた

CI 環境の macOS のアップデート後に Jenkins が起動しなくなりました。

エラーログをみると何やらパーミッションの問題が発生しているようでぐぐると再インストールで直るとのことだったので homebrew で再インストールしたところ普通に起動するようになりました。

設定とかは .jenkins ディレクトリにあって jenkins 本体とは関係ないのでそれだけで復旧することができました、めでたしめでたし。

Xcode の更新

これは特に問題なくできました。

ビルドしたら色々警告が出たので修正

Run script から出る警告の修正

Xcode 14からこんな警告が出るようになりました。

warning build: Run script build phase 'HogeHoge' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase.

これは Run script の設定の output の依存もしくは Based on dependency analysis が正しく設定されていない場合に発生します。

  • output があるものは output のファイルを設定
  • output などの依存がないものは Based on dependency analysis のチェックを外す

ことで修正しました。

cocoapods で管理してるライブラリの IPHONEOS_DEPLOYMENT_TARGET

feather/src/Pods/Pods.xcodeproj warning project: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 9.0, but the range of supported deployment target versions is 11.0 to 16.0.99.

的な警告です。

以前 Xcode 13 にアップデートしたときにも発生していたやつなので、これと同様の方法で直しました(8じゃなくて11にした)。

IPHONEOS_DEPLOYMENT_TARGET is set… | Apple Developer Forums

こんな感じの警告が出ます。

これは "Run script から出る警告の修正" で紹介した原因と同じなのですが、 cocoapods で入れているライブラリなのでプロジェクト設定を xcode からいじっても意味がありません。

こちらで提案されている workaround で修正しました。

XCode beta 14 build produces an unexpected warning · Issue #11477 · CocoaPods/CocoaPods · GitHub

その他

Objective-C のコンパイルエラー

こんなエラーが出ました。おそらく型が厳密に解決できないからエラーになっていると思い NSArray の定義を NSArray <HOGE *> * としたらエラーが解消しました。

String の比較のテストが失敗する

こんな感じに文字列を比較するテストがあるのですがなぜか失敗するようになりました(コードは何も変えていない...)。

テスト結果の出力を見ると以下のメッセージでした(見やすくするために改行しています)。

testInsertGuideMessage: ((store.templates[0]) equal to (NSLocalizedString(@"how-to-delete-template-text", nil)))
failed:
("Swipe left to delete fixed messages") is not equal to 
("Swipe left to delete fixed messages")

一体何が違う...?????

こんな感じに一度 NSString に変換してから比較を行うとちゃんとテストを通過します...

予想ですが、 store.templates の方は実態は Swift のコードになっていて、なんか内部的な型の違いで違う値と判断されたのではないかと思っています。

Archive 時にエラーになる

こんな感じのエラーが出ます。

error build: Signing for "XXXXX" requires a development team. Select a development team in the Signing & Capabilities editor.

この workaround を追加して解決しました。

github.com

fastlane で export するときに失敗する

error: exportArchive: exportOptionsPlist error for key "uploadBitcode": cannot upload bitcode because bitcode is imbalanced Error Domain=IDEFoundationErrorDomain Code=1 "exportOptionsPlist error for key "uploadBitcode": cannot upload bitcode because bitcode is imbalanced" UserInfo={NSLocalizedDescription=exportOptionsPlist error for key "uploadBitcode": cannot upload bitcode because bitcode is imbalanced}

Xcode 14からは bit bode が非推奨になりデフォルトで生成されないようになりました。

fastlane 側で uploadBitcode が true になっているにも関わらず bit code がないのでエラーになったようです。

Fastfile の bit code に関連するオプションをすべて削除して修正しました。

多分大丈夫

これらの修正をすべて行い App Store connect に submit したところとくにエラーになりませんでした。

workaround を色々通過しているのであとで実際に審査をしたときに reject されないことを願います。

まとめ

Xcode 14 で無事 app store に submit するところまでできました。

まだ審査を行ったわけではないので、近いうちに試してみたいと思います。

こういうときに追加した workaround って削除しどきを見失いますよね...