Flutter製のiOSアプリでApple Watchを連携する際にいろいろハマった点があったのでメモに残しておきます。
環境
- Flutter 2.5.2
- Xcode 13.0
基本的な手順
- XcodeのiOSプロジェクトにWatchのターゲットを追加
- プロフェクトフォルダ内/ios/Runner.wcworkspaceをXcodeで開く
- File>New>Target>WatcOS>Watch App for iOS App
- 任意のプロジェクト名(ここの記事ではwatchとする)をつけて作成
- bitcodeをYESに変更
- iOSとWatchOSのバージョン番号を一致させる
- Flutter Method ChannelでFlutterとSwift間のデータのやり取りを実装
詳細はこちらの記事を参照ください。画像もありとてもわかり易いです。
参考記事には書いてないが対応が必要だったこと
watchフォルダにInfo.plistを作成してそれを利用するように設定する
-
Info.plistファイルを追加
-
TARGETS>watch>Infoにもともとある設定を作成したInfo.plistに追加(コピペできる)
-
watchのターゲット>Build Settings>Info.plist Fileの項目に追加したInfo.plistのパスを記述
Supported PlatformをwatchOSに変更
- TARGETSのwatch, watch WatchKit ExtensionともにwatchOSに変更する
以上でエラーなくビルドが通ると思います。
ハマった点
何度ビルドしてもWatchにアプリがインストールされない
- iOSのアプリを削除してからビルドするとインストールされる
XcodeからはビルドできるがVSCodeからビルドできない
- フォルダ内にinfo.plistを作成。Buil settingsのinfo.plist fileにパスを記述して解決。
Flutter側からはInfo.plistのWKCompanionAppBundleIdentifierの設定を見てwatchアプリがあるかどうかを確認してる。今のXcodeだとwatchのターゲット追加したときにInfo.plistが生成されない模様。
アーカイブでエラーが出る
-
Supported PlatformsがiOSになっていたのをwatchOSに変更して解決。
multiple commands produce…というエラー
- 追加したInfo.plistのTarget Membershipにチェックされてるのであれば全部外して解決。
Could not run build/ios/iphoneos/Runner.app on …というエラー
- VSCode, Xcodeを再起動、flutter cleanで解決。