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.

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかはあまり載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

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の基礎文法を素早くインプットできる/


Dart入門 - Dartの要点をつかむためのクイックツアー

タイトルとURLをコピーしました