Flutter: MacOSのデスクトップアプリをApp Store ConnectにDistributeしようとしたら、「App sandbox not enabled.」のエラー
結論:entitlementsファイルに権限を追加
2022/3/16 Flutter エラー・バグ日記
App Store Connectへの送信は、毎回苦労するので、今回も何らかエラーが出るだろうと覚悟していたが、案の定。。
エラーの内容は以下の通り。
App sandbox not enabled. The following executables must include the "com.apple.security.app-sandbox" entitlement with a Boolean value of true in the entitlements property list: [( "com.####.pkg/Payload/####.app/Contents/MacOS/####" )] Refer to App Sandbox page at https://developer.apple.com/documentation/security/app_sandbox for more information on sandboxing your app.
Sandboxが有効になっていない、ということらしい。
確かに、MacOS用を作り始めた際、ネットワークへの接続や端末内への読み書きをできるようにするため、下記の情報を参考にさせていただき、「DebugProfile.entitlements」と「Release.entitlements」の「com.apple.security.app-sandbox」を「false」に修正していた(こうしないとエラーになるため)。
どうやらリリース用となると、セキュリティの観点から、外部からのアクセスを制限できるようにするため、Sandboxは有効化しなければならないらしい。
有効化すると諸々のアクセスができなくなる。。と思ったが、下記のFlutter公式の説明をよく見ると、Sandboxを有効化した上で、entitlementsファイルに、いくつかの権限付与設定(true設定)をすれば良いと書かれていた。
そこで、「com.apple.security.app-sandbox」を「true」に戻した上で、公式の説明に沿って、entitlementsファイルのデフォルトの状態に「com.apple.security.network.client」と「com.apple.security.files.user-selected.read-write」を「true」にして追加。
すると、Sandboxを有効化しても、端末内へのデータの読み書きや、ネットワークへのアクセスは問題なく動作できた。
ただし、「path_provider_macos」パッケージ(こちらの日記に導入経緯を記載)の「getApplicationSupportPath」メソッドのパスが大きく変わっていた。
Sandbox有効化前:
/Users/##Macのユーザー名##/Library/Application Support/##アプリのバンドルID名##
↓
Sandbox有効化後:
/Users/##Macのユーザー名##/Library/Containers/##アプリのバンドルID名##/Data/Library/Application Support/##アプリのバンドルID名/
だいぶ深くなっている。。。
また、Macのダウンロードフォルダにファイルを保存する機能を実装していたが、Sandboxを有効化すると、以下のエラーが出て、機能しなくなってしまった。
SocketException: Connection failed
(OS Error: Operation not permitted, errno = 1)
上記の深い場所に変更されたパスのDataフォルダ内には、「Downloads」フォルダヘのショートカットがあるのだが、エラーログを見たところ、そこに保存しようとしてエラーになる模様(あるのはショートカットだけで、フォルダの実態は無いため?)。
悩みつつ、entitlementsファイルで権限付与できる項目を調べるため、Apple公式の下記ぺージを確認したところ、「com.apple.security.files.downloads.read-write」という権限項目があることを発見。
早速、上記項目をentitlementsファイルに書き加えて「true」で設定すると、無事、Macのダウンロードフォルダに問題なく保存できるようになった。
ちなみに、Xcode上で、「Runner」→「Signing & Capabilities」→「+Capabilities」を押すと、「App Sandbox」というリスト画面が表示され、ここでチェックボックスによる設定もできるみたいだが、よく理解せずにチェックすると、entitlementsファイルが、意図しない形で全て書き換わってしまうので、注意が必要。
Flutterの公式にも、慣れている人以外はXcode上では設定しない方が良い、と書かれているので、Apple公式の権限リストを見ながら、自分でentitlementsファイルに書き込んだ方が良さそう。
最後に、自分が設定した「macos/Runner/DebugProfile.entitlements」と「macos/Runner/Release.entitlements」の設定をメモしておく。両方とも全く同じに設定した。
これで無事、App Store ConnectにDistributeすることができた。
<dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.network.server</key> <true/> <key>com.apple.security.network.client</key> <true/> <key>com.apple.security.files.user-selected.read-write</key> <true/> <key>com.apple.security.files.downloads.read-write</key> <true/> </dict>
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/