kugi's notebook

やったこと、思ったことなどつらつらと書きます

Flutter build for iOS ~SDKは更新すべし~

はじめに

Cammelでは4月からFlutterを用いた新プロダクトを開発しています。 クロスプラットフォームReactNativeFlutterとなったときに、どちらとも誰も経験がなかったのでルーレットで決まりました。

f:id:kugi_masa:20200715110246p:plain
Flutterに決まったぞ!🎉

コロナの影響でフルリモートです。

👨‍💻 ))))) (((((👨‍💻

私はMacユーザなので、今回はiOSビルドで困ったことについて書きます。

Simulatorと実機

Simulatorビルド後に実機ビルド(逆もしかり)をしようとすると、 以下のようなエラーが出ていました。

error: Building for iOS, but the linked and embedded framework 'App.framework' was built for iOS Simulator. 
(in target 'Runner' from project 'Runner')

先に結論からいいます。

SDKは更新しましょう!

以下のリンクにもあるように、v1.15.4以降のFlutterプロジェクトであれば、切り替えてビルドをしてもエラーは出なくなっています。 Xcode 11.4 Support - Flutter

何をしたか

ここからは、私が行った手順に沿って書いていきます。

前振り

私たちは開発スタート時Flutter SDKv1.12.13.hotfix+9を使っていました。

Flutter SDKのアップグレード

flutter upgrade

SDKを更新します。

Flutter is already up to date on channel stable
Flutter 1.17.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 8af6b2f038 (11 days ago) • 2020-06-30 12:53:55 -0700
Engine • revision ee76268252
Tools • Dart 2.8.4

現在の最新は

  • Flutter SDK : v1.17.5
  • Dart : 2.8.4

でした。

エラーの確認

上記の公式のドキュメントや以下のIssueにもあるように、v1.15.4以前のFlutter SDKではSimulatorと実機を切り替えたとき私と同じようにエラーが出ていたようです。 https://github.com/flutter/flutter/issues/50568

App.framework、Flutter.frameworkを一度取り除く

公式ドキュメントの手順にそって、App.frameworkFlutter.frameworkを削除します。

コマンドラインから

rm -rf ios/Flutter/App.framework
rm -rf ios/Flutter/Flutter.framework

コマンドラインから削除した場合はios/Runner.xcworkspaceでもReferenceが消えているか確認

Xcodeから

f:id:kugi_masa:20200715112703p:plain
Referenceは残さず完全に削除

ドキュメント通りの設定がされているか念のため確認

Simulatorにビルド

私はAndroid Studioを使っているので、Android Studioでビルドしました。

Embed Frameworksの確認

再度ios/Runner.xcworkspaceを開き以下のようにチェックをつける

f:id:kugi_masa:20200715113258p:plain
Runner.xcworkspace

実機にビルド->Simulatorにビルド-> and so on ...

この後、AndroidStudioに戻り、 iOS実機 -> Simulator -> iOS実機の順で3回ビルドしました。

これで実機からSimulator、Simulatorから実機での切り替えを確認できました。

まとめ

実は開発が始まって1ヶ月がたったぐらいでSDK更新の話は出ました。 (そのときはv1.17.1 or v1.12.13+hotfix.9でした)

しかし、そのときの最新(v1.17.1)ではなぜかiOSで画面遷移後にWidgetが一部表示されないという問題があり、最新SDKに合わせて実装し直すか、チームで統一した現在のバージョン(v1.12.13+hotfix.9)の実装のままでいくかで議論しました。

そのときは開発序盤だったので機能追加を優先して手戻りをせずにv1.12.13+hotfix.9で統一することとしました。

今回ビルドで問題が起きたことでSDKはあげることになりましたが、 v1.17.1時点でのチームの結論はそれはそれでよかったのかなと思います。

何はともあれ、スムーズにアップグレードに移行できてよかったです👍 (現在の実装ではv1.17.1時点でのWidgetのバグも解消されていた...!!)

github.com

やったこと

  • FlutterのSDKを更新してスムーズにiOSビルドできるようにした

わかったこと

  • SDKは積極的に更新していこう!!

次やりたいこと

  • そろそろ右上のDebugラベル取りたい