Android向けFlutterアプリをMacビルドにも対応する
こんにちは。Showcase Gigでエンジニアアルバイトをしている内城です。
皆さんはFlutter 3.0で発表されたmacOSの正式対応をもう試しましたか? いちいちエミュレータを立ち上げずとも簡単スマートフォンアプリの動作確認を行えたり、Flutterの知識さえあればmacOSネイティブのアプリ作成方法の知識があまりなくても動くものを作れるなど、さまざまなメリットがあります。 ここでは、実際にFlutterで作成されたiOS/Android向けアプリをmacOS向けにビルドするための設定方法を紹介します。
作業前の注意点
既存のアプリをマックに対応させる上で気を付けたい点がいくつかあります。特に以下の2点は要注意です。
使用しているパッケージはmacOSに対応しているか
flavorがなくても問題ないか
使用しているパッケージはmacOSに対応しているか
iOS/Androidには対応しているもののほかのプラットフォームでは使えないパッケージが比較的多くあるため、まず注意が必要です。 もし使用しているパッケージの中にmacOS対応がなされていないものがあったりすると、そこだけ条件分岐するなどして代替となる処理を追加する、macOSでは使用できない旨を表示するなどの対応が必要となります。 後から焦らないためにも、最初にパッケージの利用可否を確認することをお勧めします。
flavorがなくても問題ないか
flavorとは設定ファイルなどを環境で分ける際に便利な機能で、Firebaseの接続先を製品版と開発版で分けるなどの用途で使っている方も多いはずです。 これに関して注意しておきたいのが、 2022年12月時点では、macOS向けのFlutterではflavorがサポートされていない ということです。 公式リポジトリのissueには上がっているのですが、現状すぐに対応されるといった雰囲気もなさそうです。 こういった事情があるため、スマートフォン向けアプリとは違い、flavorは使用できないということを抑えておきましょう。
手順
ここからは具体的な手順に関して説明していきます。
コード生成
macOSでビルドしたいプロジェクトのルートに移動し、以下のコマンドを使用します。 こうすることで、ios/ , android/ のようなプラットフォーム固有のコードを生成できます
flutter create --platforms=macos
entitlementの設定
macOSのアプリはサンドボックスと呼ばれるホストとはある程度隔離された環境下で実行されることが知られています。 これには、ネットワーク機能やファイル読み書きなどに関して処理に制限をかけることで、セキュリティを向上するという目的があります。 Flutterを使ってmacOS向けアプリを作成する際もこの権限の設定は必要です。 そしてそれを記述するのが entitlement と呼ばれるファイルです。
基本的には、公式サイトにある通り書けば問題なく動くはずです。
例えば、ネット接続を有効化するためには macos/Runner/*.entitlements に以下のようなコードを追加します。
...
<dict>
...
<key>com.apple.security.network.client</key>
<true/>
</dict>
...
プラットフォーム依存箇所の分岐
ネイティブ依存の機能や、iOS/Androidは対応しているがmacOSなどのデスクトップには対応していないプラグインなどが元のアプリに使われている場合があります。 もちろん同じように処理できれば良いのですが、そうはいかない場合もあるでしょう。
そのような場合は素直に Platform.isMacOS などを使用して条件分岐で対応しましょう。 RiverpodなどDIが可能なパッケージを使っている場合は、該当処理をインターフェースなどに抽出して、プラットフォームごとにそれを実装していくのも1つの手です。
起動・ビルド
起動する際はスマートフォン版とほとんど変わりません。以下のコマンドを打つことでmacOS版が動くようになります。ホットリロード・リスタートも同様に使用できます。
flutter run -d macos
ビルドも同様で、引数のみ変更すれば他プラットフォームと同じようにビルドできます。
flutter build macos