🔰
[swift個人開発]外部ライブラリ利用時にシミュレータでは実行できるのに実機で動かない
結論
Xcodeのプロジェクトの設定から"Embed & Sign"を選択する必要がある。
どのようなエラー?
アプリは簡単なメモアプリで、メモの保存先としてローカルのDB(RealmSwift.framework)を構築しています。
シミュレータでは実行できるのに、実機(iPhone,iPad)などのデバイスで動かない。
症状:アプリを起動するとクラッシュを引き起こす。
以下にiPadで実行したときのエラーを示します。
※エラーログは固有の情報を削除しています。
dyld: Library not loaded: @rpath/RealmSwift.framework/RealmSwift
Reason: image not found
考えられる原因
- Realm が正しくインストールされている?
- RealmSwift のフレームワークがリンクされている?
- "Embed & Sign" の設定を確認する
原因の切り分け
1.と2.はシミュレータではメモが保存が正しくできていたので、問題なしと考えました。
そのため、3.のEmbed & Sign" の設定が正しくできているか確認を行います。
結果と解決方法
Xcodeのプロジェクトの設定から"Embed & Sign"を選択することで、実機で正しく起動できるようになりました。
- プロジェクトを選択する。
- "General"のタブを選択して"Frameworks, Libraries, and Embedded Content"から該当するライブラリの設定を"Embed & Sign"に変更する。
"Embed & Sign"とは
実機で外部ライブラリを正しくロードするための設定する必要があります。
この設定を行うことで
- 動的にリンク
アプリケーションバンドル内に正しく含められ、実機でアプリが起動する際にシステムが必要なフレームワークとして認識できるようになります。
正しく設定されていない場合、ライブラリが見つからずにアプリのクラッシュにつながります。 - コード署名とセキュリティポリシー
- 署名の整合性
Apple のセキュリティ要件により、アプリとその中に含まれるすべての動的ライブラリは、同一の証明書で署名される必要があります。
RealmSwift.framework もアプリ本体と同じ証明書で署名され、システムが改ざんされていないことを確認できるようになります。 - セキュリティポリシー
適切に署名されていないライブラリは、システムによってロードが拒否され、結果としてアプリが実機上で正常に動作できません。
https://support.apple.com/ja-jp/guide/security/sec7c917bf14/web#:~:text=コード署名の検証%3A iOSおよびiPadOSでは、デベロッパがアプリ内にフレームワークを埋め込み、そのフレームワークをアプリ自体またはアプリに埋め込まれた機能拡張で使用することが可能です。システムやその他のアプリがそのアドレス空間内に第三者のコードを読み込むことを防止するため、プロセスがリンクするすべてのダイナミックライブラリについて、起動時にコード署名の検証が実行されます。
Appleプラットフォームのセキュリティ - iOSおよびiPadOSのアプリコード署名プロセス - デベロッパがアプリに署名する方法
Discussion