はじめに
下記のようにやってたけど、指摘があってクリーンビルドしたら dyld: Library not loaded:
が見つからなくてクラッシュするので、下記に書かれているようにReleaseのみにする方法はやめましょう...!!
Release時のみ実行(してしまうとまずい)
iOSアプリ開発でCarthage使う時、Run Scriptにcopy-frameworksを設定すると思うんだけど、これはApp Storeへのサブミット時の不具合を回避するために設定しているのということなので、普段のDebugビルド時にはいらないんじゃないかなと。
つまり、Run Scriptは次のようにしていいんでは...という気持ちで下記のようにしてました
if [ "${CONFIGURATION}" = "Release" ]; then
/usr/local/bin/carthage copy-frameworks
fi
この"${CONFIGURATION}"
の ReleaseはXcodeでデフォルトで用意されているので、自分でカスタムするものではなく、それをそのまま使っています。
しかしこれではクリーンビルドしてしまうと次のビルド実行後はダイナミックライブラリが見つからずに実行時エラーになってしまうのでした。
追記: Debug時にもcopy-frameworks必要という件の概要
岸川さん( @kishikawakatsumi )に指摘をしてもらった内容を追記します
バイナリの除去は必要ないけどコピーは必要なので、これはCarthageのドキュメントに従ってEmbeddedじゃなくてLinked Frameworksにドラッグ&ドロップしてたら動かないですね。
— kishikawa katsumi (@k_katsumi) 2018年3月16日
他にも指摘をしてくれたんですが割愛させてもらって、なぜCarthageのドキュメントどおりにしてcopy-frameworksの実行が必要かを記載します
- 前提として
- ライブラリをDynamic Frameworkとしてビルドして利用する場合、app bundleのFrameworksにコピーされる必要がある
- copy-frameworksはinput filesに追加したパスのフレームワークをコピーしてくれている
- iTunesへの申請にはシミュレータ用のバイナリがipaに含まれてはいけない
- copy-frameworksはi386とx86_64をipaから省いてもくれる(Valid Archのみにしている)
- ライブラリをDynamic Frameworkとしてビルドして利用する場合、app bundleのFrameworksにコピーされる必要がある
- Linked Frameworksに追加するのは
- Linkとビルドフェーズに設定を追加している
つまり、ipaをValid ArchのみにしてくれてるのはRelease時のみでいいが、フレームワークのコピーはDebug時でもやる必要があるので(一度やればキャッシュが残っているがクリーンビルドで消える)、Debug時でもcopy-frameworksが必要だということですね。
関連
CrashlyticsのdSYM送信スクリプトをRelease時のみ実行したい
https://qiita.com/yimajo/items/98cbf5bdbc098c683657