Slide 1

Slide 1 text

StudyplusにおけるFlutterアプリのApple Watch対応事例 第9回 FlutterGakkai スポンサーセッション

Slide 2

Slide 2 text

名前:こういち(X:@koichi_mobile) 所属:スタディプラス株式会社 25年新卒 自己紹介

Slide 3

Slide 3 text

目的

Slide 4

Slide 4 text

Flutter開発者が「Apple Watch開発できそう 」と思えること 目的

Slide 5

Slide 5 text

会社・サービス紹介

Slide 6

Slide 6 text

スタディプラス の紹介 当社は「学ぶ喜びを全ての人へ」 をミッションに「学習者を第一に」 を掲げ、学習管理プ ラットフォーム「Studyplus」と「Studyplus for School」を提供しています。 先生による生徒の学習支援をサポート 学習者の「学習の継続」を支援

Slide 7

Slide 7 text

学習記録機能 - 学習教材を選択 - ストップウォッチやタイマーで時間計測 - グラフで学習の可視化 - タイムラインで自分やフォロワーの記録確認 成績管理、カレンダーで予定管理、大学の検索 Studyplusの既存機能

Slide 8

Slide 8 text

当社がFlutterで開発しているサービス Studyplus モバイルアプリ - Flutter Studyplus Webアプリ - Flutter Web

Slide 9

Slide 9 text

開発者ブログ:https://tech.studyplus.co.jp/ ポッドキャスト:https://open.spotify.com/show/3dKmSxheHocHwRA87eOOIN 開発者向けX:https://x.com/studyplus_dev など、いろいろ発信しています! ご興味ある方は「スタディプラス エンジニア 」で検索。 当社エンジニア各種SNS・情報発信

Slide 10

Slide 10 text

1. 背景・対応内容 2. 得られた結果 3. 仕様・デザイン決定 4. 実装時のポイント 5. まとめ 目次

Slide 11

Slide 11 text

背景 ユーザーの声 「スマホだとYouTubeやInstagramなど他アプリに触れてしまう誘惑が大きい」 「通学中の電車の中でサッと記録したい」

Slide 12

Slide 12 text

背景 Studyplusアプリ - 2025年4月にiOS / AndroidアプリをFlutterにリプレイス - 2025年8月にFlutterアプリをApple Watchに対応完了

Slide 13

Slide 13 text

- 教材を選択 - 学習時間をストップウォッチ、タイマーで計測 - 学習記録をスマホと連携 対応内容・機能

Slide 14

Slide 14 text

得られた結果

Slide 15

Slide 15 text

- 総ユーザー:6,000程度 - お問い合わせやXでのフィードバック 得られた結果

Slide 16

Slide 16 text

得られた結果

Slide 17

Slide 17 text

仕様・デザイン決定

Slide 18

Slide 18 text

各画面でユーザーが最も行いたいアクション は何か? 仕様・デザイン決定

Slide 19

Slide 19 text

教材一覧画面( iOS版 ) - 教材の追加、並び替え、編集、削除 - 教材カテゴリの追加、編集 - 集計単位の編集 - 教材タップで学習記録画面へ 仕様・デザイン決定

Slide 20

Slide 20 text

教材一覧画面( watchOS版 ) - 教材の追加、並び替え、編集、削除 - 教材カテゴリの追加、編集 - 集計単位の編集 - 教材タップで学習記録画面へ 仕様・デザイン決定

Slide 21

Slide 21 text

各画面でユーザーが最も行いたいアクション は何か? 不要な部分は削る 仕様・デザイン決定

Slide 22

Slide 22 text

実装時のポイント

Slide 23

Slide 23 text

構成 Flutter ↔ iOS はMethod Channel ( Pigeon ) iOS ↔ watchOS はWCSession

Slide 24

Slide 24 text

開発の流れ 1. 既存アプリにwatchOSのターゲットを追加 2. Apple Watch側の実装(画面作成、iOSとの繋ぎ込み) 3. iOS側の実装(watchOS、Flutterとの繋ぎ込み) 4. Flutter側の実装(iOSとの繋ぎ込み、保存・反映処理)

Slide 25

Slide 25 text

実装時のはまりポイント

Slide 26

Slide 26 text

はまりポイント① Xcodeのビルドが通らない 既存アプリとの連携やwatchOSのターゲット追加等でエラー発生

Slide 27

Slide 27 text

WCSession counterpart app not installed 発生場面 既存アプリにwatchOSのターゲットを追加した時 原因 Apple Watchのアプリがアプリ本体に組み込まれておらず、認識されていない

Slide 28

Slide 28 text

対処 Runnerの「Frameworks, Libraries, and Embedded Content」に WatchApp を追加 WCSession counterpart app not installed

Slide 29

Slide 29 text

発生場面 既存アプリにwatchOSのターゲットを追加した時 原因 Build Phaseに問題があり、循環エラーが発生している Cycle inside Runner; building could produce unreliable results

Slide 30

Slide 30 text

Cycle inside Runner; building could produce unreliable results 対処 Runner > Build Phase で「Run Script」を 「Compile Sources」の前に持ってくる

Slide 31

Slide 31 text

はまりポイント① Xcodeのビルドが通らない スライド末尾にエラー対処集をまとめました

Slide 32

Slide 32 text

はまりポイント① Xcodeのビルドが通らない その他既存アプリ起因のエラー - 他のメンバーに聞く … - 気合い…

Slide 33

Slide 33 text

はまりポイント② コンフリクト解消 開発期間が長くなると他の実装内容とのコンフリクトが増える - 初めて実装する場合はMVPにとどめる - SiriショートカットやWidget等のiOS実装と並行して作業しない - 設計・デザイン作成を予め行い、実装期間を短くする

Slide 34

Slide 34 text

はまりポイント③ iOS、watchOS両方のログが確認できない XcodeでiOS、watchOSアプリを実行すると片方のログしか確認できない - Macの場合は「コンソール」アプリで両OSのログを確認できる

Slide 35

Slide 35 text

iPhoneをケーブルでMacに繋ぐ 両OSのログが確認可能 はまりポイント③ iOS、watchOS両方のログが確認できない

Slide 36

Slide 36 text

watchOS、 iOS、 Flutterのそれぞれの接続部分の処理を実装 例)watchOSの実装 watchOSからiOSに送信する処理 watchOSがiOSからデータを受け取った際 の処理 はまりポイント④ どこを実装しているかごちゃごちゃになる

Slide 37

Slide 37 text

今どこの何の処理を書いてるんだっけ? はまりポイント④ どこを実装しているかごちゃごちゃになる

Slide 38

Slide 38 text

混乱の原因 「処理の流れ」と「実装の流れ」の違い はまりポイント④ どこを実装しているかごちゃごちゃになる

Slide 39

Slide 39 text

学習記録の保存処理 処理の流れ はまりポイント④ どこを実装しているかごちゃごちゃになる

Slide 40

Slide 40 text

学習記録の保存処理 実装の流れ はまりポイント④ どこを実装しているかごちゃごちゃになる

Slide 41

Slide 41 text

はまりポイント④ どこを実装しているかごちゃごちゃになる 対策 - 先述の「コンソール」アプリ等で処理の流れを確認しながら実装を進める - どの部分を実装しているか常に念頭に置いておく

Slide 42

Slide 42 text

まとめ

Slide 43

Slide 43 text

- 背景、対応内容、得られた結果 - 仕様・デザイン決定時にはユーザーが行いたいアクション に注目 - 実装時のはまりポイント - 今回できなかった技術面の話:Flutter × Apple Watch 開発入門 FlutterアプリのApple Watch対応の第一歩の参考になれば ... まとめ Flutter × Apple Watch 開発入門

Slide 44

Slide 44 text

最後にお知らせ Flutterイベント開催します QRコードからぜひご参加ください☝

Slide 45

Slide 45 text

エラー対処集

Slide 46

Slide 46 text

原因 Apple Watchのアプリがアプリ本体に組み込まれておらず、認識されていない WCSession counterpart app not installed

Slide 47

Slide 47 text

対処 Runnerの「Frameworks, Libraries, and Embedded Content」に WatchApp を追加 WCSession counterpart app not installed

Slide 48

Slide 48 text

原因 Build Phaseに問題があり、循環エラーが発生している Cycle inside Runner; building could produce unreliable results

Slide 49

Slide 49 text

Cycle inside Runner; building could produce unreliable results 対処 Runner > Build Phase で「Run Script」を 「Compile Sources」の前に持ってくる

Slide 50

Slide 50 text

原因 Apple WatchのBundle IDが適切に設定されていない WatchKit App doesn't contain any WatchKit Extensions whose WKAppBundleIdentifier matches.

Slide 51

Slide 51 text

対処 Apple Watch ターゲット > Info.plist > WKCompanionAppBundleldentifier の値をRunnerのBundle Identifierと合わせる WatchKit App doesn't contain any WatchKit Extensions whose WKAppBundleIdentifier matches.

Slide 52

Slide 52 text

原因 Apple Watch側のInfo.plistが設定されていない Build input file cannot be found.

Slide 53

Slide 53 text

対処 ios > WatchApp > Info.plistを追加 Build input file cannot be found.

Slide 54

Slide 54 text

原因 watchOSの対応バージョンが小さすぎる 'NavigationStack' is only available in watchOS 9.0 or newer

Slide 55

Slide 55 text

対処 General > Minimum Deployments > watchOS の値を大きくする 'NavigationStack' is only available in watchOS 9.0 or newer

Slide 56

Slide 56 text

現象 Simulatorでビルドした際にApple Watchで行った操作がiPhone側に反映されない 原因 iPhoneとApple WatchのSimulatorがペアリングされていない Simulatorで検証できない

Slide 57

Slide 57 text

対処 ペアリングした状態のSimulatorを登録 Apple Watch via iPhone で実行 Simulatorで検証できない