Introduction

Flutter である iOS プロジェクトを含むコードをビルドした時、下記のエラーが出力された。

1
2
3
Could not build the precompiled application for the device.
Uncategorized (Xcode): The signature of xxxxx.xcframework” cannot be verified.
/Users/xxxxxxxx/Work/ios/Frameworks/xxxxx.xcframework:0:0

思い当たるのは上記の 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

と表示されている。

BuildError

詳細な公式ドキュメントは Verifying the origin of your XCFrameworks を見ることになるが、自分はフレームワークを置き換えただけなのに、何故この事象が起きたのか。

今回は、krzyzanowskim/OpenSSL で配布されている xcframework を例に挙げたのだが、これらの zip で配布されている xcfrmework にシンボリックリンクが含まれていたのが原因である。

今でこそシンボリックリンクは Windows でも使用できるが、圧縮ファイルでの取り扱いとなると 7zipWinRAR でも上手くいかないことがある。
実際、

7zip

このようにシンボリックリンクがあると明記 (属性に l がついている)されているにもかかわらず、 NTFS フォーマットされたドライブに展開されてもシンボリックリンクとしては展開されなかった。
逆に、Windows 10 1809 で追加された tar コマンドで展開するシンボリックリンクが保持される。

1
$  tar -xvf .\OpenSSL.xcframework.zip

とはいえ、シンボリックリンクをクリックしても、今回のケースではおかしな位置にリンクされているため、どのみち使えない。
解決策はダウンロードしてきた zip を Mac 側で展開することである。

実際に、unzip で展開してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% unzip OpenSSL.xcframework.zip 
Archive: OpenSSL.xcframework.zip
creating: OpenSSL.xcframework/
creating: OpenSSL.xcframework/_CodeSignature/
...
inflating: OpenSSL.xcframework/ios-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy
finishing deferred symbolic links:
OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Resources -> Versions/Current/Resources
OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/Current -> A
OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Headers -> Versions/Current/Headers
OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Modules -> Versions/Current/Modules
OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/OpenSSL -> Versions/Current/OpenSSL
OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Resources -> Versions/Current/Resources
OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/Current -> A
OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Headers -> Versions/Current/Headers
OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Modules -> Versions/Current/Modules
OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/OpenSSL -> Versions/Current/OpenSSL

t-takeuchi@TAKUYA-MAC2 Frameworks % ls -lha OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Modules
lrwxr-xr-x 1 t-takeuchi staff 24B Oct 17 01:18 OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Modules -> Versions/Current/Modules

このようにシンボリックが正しく展開されていることがわかる。
この状態でビルドを実行すると成功するようになっている。

BuildOK

エラーなっていた Sigunature も、

Status Verification succeeded

に変化している。

Appendix

最近気付いたのだが、先の The signature of “xxxxx.xcframework” cannot be verified エラーの文字列だが、 flutter のバージョンによって少しエラーの出力が異なっている。

Flutter 3.16.9

1
2
3
/Users/xxxxxxxx/Work/ios/Frameworks/“xxxxx.xcframework:1:1: error: The signature of “xxxxx.xcframework” cannot be verified.
note: A sealed resource is missing or invalid
note: /Users/xxxxxxxx/Work/ios/Frameworks/“xxxxx.xcframework: a sealed resource is missing or invalid

Flutter 3.24.3

1
2
3
Could not build the precompiled application for the device.
Uncategorized (Xcode): The signature of “xxxxx.xcframework” cannot be verified.
/Users/xxxxxxxx/Work/ios/Frameworks/“xxxxx.xcframework:0:0