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

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

目次

App Store Connectへの登録

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

Xcodeの設定

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

Runner.xcworkspaceを開く
Runner.xcworkspaceを開く

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

Generalタブ

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

  • App Category

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

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

新規に開発するアプリの動作環境はそれらよりも新しいOSだと思います。それに合わせて、Deployment Targetを引き上げても問題ないでしょう。

App Categoryを編集し、Bundle Identifierは編集しない
App Categoryを編集し、Bundle Identifierは編集しない

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.xcodeprojは、macos/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の設定を開くと、プロジェクトファイルが更新されたことを確認できます。

Runnerの設定が更新されている
Runnerの設定が更新されている

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

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

% flutter build macos

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

build/macos/Build/Products/Release

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

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

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

アプリケーションパッケージを開き、Frameworksフォルダー内を確認すると、Swiftのランタイムの他、2つのフレームワークが見つかります。この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ネイティブ対応しています。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次