Introduction
Flutter である iOS プロジェクトを含むコードをビルドした時、下記のエラーが出力された。
1 | Could not build the precompiled application for the device. |
思い当たるのは上記の xxxxx.xcframework。
バージョンアップでフレームワークを置き換えただけなのだが…
なぁぜ?
How to resolve?
原因はプロジェクトに *.xcframework を追加する方法にある。
*.xcframework 内に _CodeSignature ディレクトリがあるが、ここにフレームワークの署名データが含まれており、Xcode 15 以降、ビルド時にフレームワークが改ざんされていないかをこの署名データを使って検証する。
実際、改ざんされたフレームワークを Xcode で Frameworks から選択して右ペインを見ると Signature に
Status Validation failed
Validation Error A sealed resource is missing or invalid
と表示されている。
詳細な公式ドキュメントは Verifying the origin of your XCFrameworks を見ることになるが、自分はフレームワークを置き換えただけなのに、何故この事象が起きたのか。
今回は、krzyzanowskim/OpenSSL で配布されている xcframework を例に挙げたのだが、これらの zip で配布されている xcfrmework にシンボリックリンクが含まれていたのが原因である。
今でこそシンボリックリンクは Windows でも使用できるが、圧縮ファイルでの取り扱いとなると 7zip や WinRAR でも上手くいかないことがある。
実際、
このようにシンボリックリンクがあると明記 (属性に l がついている)されているにもかかわらず、 NTFS フォーマットされたドライブに展開されてもシンボリックリンクとしては展開されなかった。
逆に、Windows 10 1809 で追加された tar
コマンドで展開するシンボリックリンクが保持される。
1 | tar -xvf .\OpenSSL.xcframework.zip |
とはいえ、シンボリックリンクをクリックしても、今回のケースではおかしな位置にリンクされているため、どのみち使えない。
解決策はダウンロードしてきた zip を Mac 側で展開することである。
実際に、unzip
で展開してみる。
1 | unzip OpenSSL.xcframework.zip |
このようにシンボリックが正しく展開されていることがわかる。
この状態でビルドを実行すると成功するようになっている。
エラーなっていた Sigunature も、
Status Verification succeeded
に変化している。
Appendix
最近気付いたのだが、先の The signature of “xxxxx.xcframework” cannot be verified
エラーの文字列だが、 flutter のバージョンによって少しエラーの出力が異なっている。
Flutter 3.16.9
1 | /Users/xxxxxxxx/Work/ios/Frameworks/“xxxxx.xcframework:1:1: error: The signature of “xxxxx.xcframework” cannot be verified. |
Flutter 3.24.3
1 | Could not build the precompiled application for the device. |