Flutter での App Clip の現状

2020/12/16に公開

※本記事は Sansan Advent Calendar 2020 の16日目の記事です。

https://adventar.org/calendars/5250

はじめに

はじめまして。普段は Sansan で iOS アプリエンジニアをしております man_bowing と申します。
名前の由来は 🙇 ←この絵文字です。
今回の記事では Flutter プロジェクトに App Clip を組み込もうと調べていたときに見つけたこちらのドキュメントを元に Flutter プロジェクトへ App Clip を組み込む実装方法についてご紹介しようと思っていました。
いました。

https://flutter.dev/docs/development/platform-integration/ios-app-clip

サンプルアプリを作り終え、記事の構成を考えていた時に何気なく公式ドキュメントを読み返しているときに、ドキュメントの先頭に大きく書いてあった警告を見落としていたことに気づきました。


こんな目立つ警告をなぜ見落としていたのか自分でも不思議です・・・

赤枠の部分には

Important: This experimental preview currently exceeds the 10MB uncompressed IPA payload size limit and cannot be used in production (#71098).
このプレビュー版では ipa のサイズが 10MB の制限超えているので本番では使えないよ。(意訳)

とあり、現状 Flutter で App Clip を作るのは難しい(作れるけど App Store へ公開できない)
ということですね。
早合点をしてしまったせいで、当初書こうと思っていた内容では書けなくなってしまったため、予定を変更して Flutter の App Clip の現在の状況についてお話をさせていただきます。すみません。

どうやって Flutter プロジェクトに AppClip を組み込んでいるか?

現状をお話する前に、まず公式ドキュメントではどのように Flutter プロジェクトに組み込んでいるかざっくりお話します。
基本的には Xcode 上での操作、対応になります。重要な部分だけ絞って並べると次のようになります。

  1. App Clip ターゲットを Flutter プロジェクトに追加する
  2. App Clip ターゲットに生成されたファイルたちを Info.plistAppClip.entitlment を残して全て削除する
  3. App 本体の AppDelegate.swiftLaunchScreen.storyobard などのファイルを AppClip ターゲットからも参照できるようにする
  4. App Clip ターゲットの Framework Search Path に Flutter framewok の設定を追加
  5. Build Script に Flutter の Script を追加

他にも entitlements の設定をしたり、ビルドの設定を変えていますが、ざっくりこんな感じで、Xcode のプロジェクト的には App 本体も App Clip もほぼ同じリソースを共有している状態です。
また、dart 側のコードについて、ターゲットごとに分割ができないため、 App 本体でも App Clip でも全ての dart ファイルが含まれる状態になります。

最初は App と App Clip で全てのリソースを共有していることがサイズオーバーの原因だと勘違いしており、 App Clip ターゲットには Add to app の機能を使って本体と別にすれば上手くいくのでは?と思っていましたが、サイズオーバーの原因はそういうことではなかったようです。

Flutter での App Clip の現状

Flutter で App Clip は作れるか?

Flutter プロジェクトへの組み込み方がわかったところで現状ですが、やはりまだ Flutter で App Clip を作ることは難しい状態です。残念。

なぜ難しいか?

理由としては既にあげている通り、 App Clip の ipa が App Clip のサイズ制限である 10MB を超えてしまっているため App Store へ申請できないからです。ちなみに公式ドキュメントの例になっている最小限のプロジェクトでも 10MB を既に超えているようです。
App Clip の内容物の内訳はここの Issue に詳しくのっていますが、一番容量を圧迫しているのは Flutter framework で、これ単体で 7MB あります。 おっきい。
dart ファイルや画像のリソース、 Swift ファイルなどが含まれることも考えると、Flutter framework が 1MB くらいに収まらないと Flutter で App Clip を作るのは難しそうですね・・・😭


Issue に書いてあった主な内訳

どうしても Flutter プロジェクトに App Clip を組み込みたい場合は?

Flutter プロジェクトで App Clip を作りたい場合は App Clip ターゲットに Flutter framework を含めない(Flutterを使わない)ようにする しか無いようです。
具体的にはアプリ本体は Flutter で作り、 App Clip は SwiftUI などのネイティブで作る必要があります。
Github の Issue でも Flutter の中の人が似たようなことをおっしゃっていたので現状は Flutter だけでは厳しいかなと。
Support app clips on iOS 14 というタイトルの Issue が App Clip だけ Flutter 使わずにネイティブで作ればいいんじゃない?という発言を最後にクローズされてるのが絶望的だなと思ってます。Flutter での App Clip 対応はされなさそうかな・・・。

最後に

一応 Flutter の Issue には Flutter 側のコード群を iOS のターゲット毎に分割できるようにならないかという Issue も上がっていますが、ほとんど議論されておらず、望みは薄そうだなという感じです。
https://github.com/flutter/flutter/issues/66805

Flutter での App Clip の作り方を説明しようとしたら、Flutter でなぜ App Clip が作れないか説明するというギャグのような記事になってしまいました。
Flutter の公式ドキュメントは非常に丁寧に書かれており、困った時によくお世話になっているのですが、しっかりドキュメント読んでいるつもりでも、意外と読めていないのだなということは反省点として感じました。
Flutter では App Clip を作ることができませんでしたが、 Flutter プロジェクト自体には App Clip を組み込むことができますし、自分が作っているアプリは App Clip に対応させたいので、めげずに作成してみようと思います。

Discussion