FlutterでMacアプリをビルドする

Flutterでデスクトップアプリが作れるようになり、気になるポイントを確認しています。この記事ではビルド方法についてです。

スポンサーリンク

App Store Connectへの登録

AppStore配布を行う場合は、App Store Connectでアプリの登録などを行います。App Store Connectでの作業はFlutterを使わない場合と同じです。

Xcodeの設定

Xcodeのプロジェクトの設定を行います。プロジェクトのコード一式のフォルダ内にmacosというフォルダがあると思います。このフォルダ内のRunner.xcworkspaceを開きます。同じフォルダにプロジェクトファイルもありますが、ワークスペースファイルの方を開きます。

ワークスペースファイルを開くと、Runner.xcodeprojが登録されていて、2つのターゲットが入っています。ターゲットRunnerの設定を開きます。

Generalタブ

Generalタブで以下の2つを設定します。

  • App Category

このタブで設定するのは上記ですが、もう一つ、注目点があります。Deployment Targetです。デフォルトでは10.11になっています。FlutterはmacOS 10.11以降対応となっています。

今となっては古いOSです。私が業務で開発しているアプリの最低環境はmacOS 10.13です。macOS 10.11だとGateKeeper2が導入されたあたりですね。Notalizeが必要になったのもこの辺だったと思います。

新規に開発するアプリの動作環境はもっと新しいOSだと思います。それに合わせて、Deployment Targetを引き上げても良いのかなと思います。

Bundle Identifierやプロダクト名は別ファイルでAppInfo.xcconfigファイルで設定するので、直接、プロジェクトファイルは編集しません。編集してしまうと、AppInfo.xcconfigファイルが反映されなくなります。

スポンサーリンク

Signing & Capabilities タブ

Signing & Capabilitiesタブで設定するのは、次の項目です。

  • Automatically manage signing
  • Team
  • Signing Certificate

デフォルトの設定状態で、App Storeに対応できるようにSandboxを使うようになっています。Sandbox対応されているので、App Storeで配布するアプリを作る事もできますね。

Sandboxの設定がDebug用とRelease用で分かれています。アプリにとって必要な機能をオンにする必要があります。

App Store以外で配布する場合やSandbox化では実行できない処理を実装する必要があるときには、Sandboxの設定を削除して、Hardened Runtimeを使用する設定に変更します。

アプリ名などの設定

以下の項目はAppInfo.xcconfigファイルで変更します。通常はXcodeのプロジェクトファイルを直接編集しますが、Runner.xcodeprojmacos/Runnder/Configs/AppInfo.xcconfigファイルで編集します。

  • PRODUCT_NAME 製品名
  • PRODUCT_BUNDLE_IDENTIFIER バンドル識別子
  • PRODUCT_COPYRIGHT 著作権情報

同じフォルダ内に、デバッグ用とリリース用のビルドオプションを設定するための、Debug.xcconfigRelease.xcconfigがあります。また、ワーニングの設定用にWarnings.xcconfigがあります。

xcconfigファイルはXcodeのプロジェクトファイルの設定を上書きするファイルなので、Flutterの場合はプロジェクトファイルを直接編集するよりも、これらのファイルを編集した方が良さそうです。

バージョン番号

バージョン番号はpubspec.ymlファイルで設定します。この値もプロジェクトファイルは編集しません。pubspec.ymlversionを変更して、アプリをビルドすると、自動的にXcodeのプロジェクトファイル内のバージョン番号も変更されます。

versionの値は次のように、+で区切って2つの番号を設定します。

version: 1.0.1+2

+の前はCFBundleShortVersionString (Version)に設定され、+の後ろ側はCFBundleVersion (Build)に設定されます。ビルド後にターゲットRunnerの設定を開くとプロジェクトファイルが更新されたことが確認できます。

Macデスクトップアプリをビルドする

Macのデスクトップアプリをビルドするには、ターミナルから次を実行します。

% flutter build macos

ビルドが完了すると、次のディレクトリにアプリケーションパッケージが作成されます。

build/macos/Build/Products/Release

Finderでダブルクリックして起動する普通のデスクトップアプリです。

ランタイムのファイルサイズ

クロスプラットフォームなライブラリは過去から多々作られてきました。多くは、MacとWindowsを共通で作れるというものでした。Flutterも含めてフレームワークを使うときにきになるのはファイルサイズです。調べてみました。

アプリケーションパッケージを開き、Frameworksフォルダ内を確認すると、Swiftのランタイムの他、2つのフレームワークが見つかります。これがFlutterのランタイムでしょう。それぞれ、容量は次の通りです。

  • App.framework 6.9MB
  • FlutterMacOS.framework 26.7MB

合計で33.6MB。う〜ん、地味に大きい。比較のため、Swiftのランタイムの容量を見てみましょう。

  • libswiftAppKit.dylib 222KB
  • libswiftCore.dylib 6.5MB
  • libswiftCoreAudio.dylib 75KB
  • libswiftCoreData.dylib 99KB
  • libswiftCoreFoundaion.dylib 42KB
  • libswiftCoreGraphics.dylib 190KB
  • libswiftCoreImage.dylib 50KB
  • libswiftCoreMedia.dylib 87KB
  • libswiftDarwin.dylib 99KB
  • libswiftDispatch.dylib 328KB
  • libswiftFoundation.dylib 3.2MB
  • libswiftIOKit.dylib 45KB
  • libswiftMetal.dylib 85KB
  • libswiftObjectiveC.dylib 62KB
  • libswiftos.dylib 72KB
  • libswiftQuartzCore.dylib 58KB
  • libswiftXPC.dylib 46KB

合計で11.26MB。Finderの流儀に合わせて1MB=1000KBで計算しました。Flutterでデスクトップアプリを作る場合には、Swiftランタイムも組み込まれるので、ランタイムが合計で44.86MBとなります。

この数字を純粋に考えると、やや大きい。しかし、開発効率や現在のストレージ事情、インターネットの通信速度を含めて考えると、許容できるサイズかなと思います。それによって作られるアプリがたた単純に側アプリで、Webブラウザで十分な機能しか持っていないとかだと、ちょっと考えてしまうサイズです。

Apple Silicon対応

ビルドされるアプリですがApple Siliconにネイティブ対応したユニバーサルバイナリになっています。Flutterでビルドしたアプリのバイナリファイルのアーキテクチャを確認すると次のようになりました。

% cd mac_menubar_demo.app/Contents/MacOS
% file mac_menubar_demo 
mac_menubar_demo: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64
- Mach-O 64-bit executable arm64]
mac_menubar_demo (for architecture x86_64):	Mach-O 64-bit executable x86_64
mac_menubar_demo (for architecture arm64):	Mach-O 64-bit executable arm64

arm64x86_64の実行コードが確かに入っているユニバーサルバイナリになっています。ランタイムのフレームワークも見てみましたが同様に入っていました。

問題なくApple Siliconネイティブ対応しています。

スポンサーリンク
最新情報をチェックしよう!