Upgrade to Pro — share decks privately, control downloads, hide ads and more …

スマートロックを支えるFlutter × ネイティブ連携の実践 / Flutter and N...

スマートロックを支えるFlutter × ネイティブ連携の実践 / Flutter and Native Integration in Practice: Powering Smart Locks

登壇者名:酒井 文也

登壇したイベントタイトル:FlutterKaigi 2026

登壇したイベントのURL: https://2026.flutterkaigi.jp/

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Technology

Transcript

  1. 自己紹介 酒井 文也 Sakai Fumiya @fumiyasac 2 ※長いのでモバイルアプリエンジニアになってからを抜粋して紹介します 2016.09 30歳の誕生日からiOSアプリ開発の勉強をスタート

    この時はまだWebエンジニアをしていました ソーシャルゲームやWebサービスの開発に従事 仕事→iOSアプリ開発の勉強 or 勉強会参加の毎日 2019.03 数社でiOSアプリ開発を経験した後に独立 iOSアプリ開発を軸に据えて様々な開発現場を経験 2021年からはAndroidアプリ開発にも挑戦 2023.01 国内最大級のハンドメイドマーケットアプリの開発に シニアエンジニアとして従事 iOS&Androidアプリ開発を中心に幅広く新機能開発や 既存機能改善に携わっていました Now 2026年2月にビットキーに入社 homehub開発部 homehub Mobileに所属 現在は「homehub」のモバイルアプリ開発を担当
  2. 自己紹介 私の現在地 Flutter歴 = 社歴 (現在約 9ヶ月) 🔰 入社するまでFlutterもIoTもほぼ触ったことがありませんでした...。 ❌「この設計が正解です」

    ⭕「こんな仕組みで動いているのか!」 FlutterもIoTも初心者だった自分がプロダクトコードを読んでワクワクした事をお裾分けしたい 3
  3. 今日のアジェンダ 入社して9ヶ月、コードを読んで「こうなってたのか!」 とワクワクしたことを3つ紹介します。 4 1. 本題の前に - 「何の話?」を少しだけ補足 2. ワクワク①

    - Flutterのボタンが玄関の鍵を回すまで 3. ワクワク② - 電波の向こうの相手と話す作法 4. ワクワク③ - アプリを開かなくても鍵が開く 5. まとめ - 9ヶ月の自分が持ち帰ったこと
  4. 本題の前に homehubアプリとその相手 アプリでできること • ボタンひとつで施錠・解錠 🔓 • 近づくだけで解錠する”手ぶら解錠”🚶 • 外出先からの遠隔操作

    🌐 アプリの相手は、画面の向こうの物理デバイス 🔓 スマートロック ①BLE直接 homehubアプリ 8 ②ゲートウェイ経由 📶 WiFi/LTE 🔓 スマートロック ③位置情報+BLE 📍 帰宅を検知 🔓 スマートロック ※自社製ロックに加えて、ベンダーも通信仕様も異なる多様なスマートロックとつながる。
  5. 本題の前に 入社して最初に驚いたこと 入社前の自分のイメージ • Flutter = UIを作るフレームワーク • ハードウェアを動かすならネイティブで書くものでは...? 実際にコードを開いてみると

    ... • Flutter アプリから多種多様なスマートロックを動かしている • しかもそのやり取りは1本の通り道( Method Channel)にまとまっていた IoTってFlutterでも動くんだ! という発見と驚き 今日はこの通り道の先で何が起きているのかを、9ヶ月の自分が知った順番でお話しします。 9
  6. 本題の前に Platform Channelのおさらい Flutter(Dart)からネイティブの機能を使うためのFlutter公式の仕組み。 Flutter (Dart) MethodChannel (Dart → Native)

    EventChannel (Native → Dart) お願いを送る お知らせを受け取る Android (Kotlin) / iOS (Swift) Bluetooth・位置情報など OSの機能 - MethodChannel: Dart 👉 ネイティブ。 ”スキャンして” “鍵を開けて” とお願いする - EventChannel: ネイティブ 👉 Dart。 ”見つかった” “つながった” を流し続ける homehubでは すべてのデバイスとのやり取りがこの 2本だけ を通っている。 10
  7. ワクワク①:Flutter のボタンが玄関の鍵を回すまで ボタンを押してから鍵が開くまで ユーザーにとっては「ボタンを押すだけ」。その裏側ではこの様な事が起きている。 📱 Flutter (Dart) 🍎 🤖 ネイティブ

    ① “開けて”をお願い ② 宛先を見て担当者へ 振り分ける (Method Channel) ⑥ 結果を受け取って 画面に反映 ③ Bluetoothでコマンド送信 ④ 鍵を回す ⑤ “開いた”をお知らせ 応答 (Event Channel) ポイント : Dart側からは ”お願いする” と ”お知らせを待つ” の2つしかしていない。 12 🔒 スマートロック
  8. ワクワク①:Flutter のボタンが玄関の鍵を回すまで お願いは「名前」で届く すべてのお願いは "担当.やること " という名前付きのメッセージ としてMethodChannelを通る。 💁 命名例

    "Scanner.startScanSession" スキャン担当へ "Connector.connectPeripheral" 接続担当へ "Commands.LockDevice.turnThumbturn" "Geofence.addRegion" コマンド担当 位置情報担当へ ワクワクしたところ : 通り道は1本のまま名前を増やすだけで機能が増やせる 。 ※ネイティブ側は名前を見て担当者に振り分けるだけ。 14 鍵の操作担当へ
  9. ワクワク②:電波の向こうの相手と話す作法 BLE接続の始まりから終わりまで 鍵を1回開けるだけでも、BLEではこれだけの段階を踏む 。 🔍 探す 🔗 つなぐ 🔐 確かめる

    📨 お願いする 👋 切る スキャン 接続 認証 コマンド送信 切断 段階 やっていること 🔍 探す 周りの電波から目的のデバイスを見つける 🔗 つなぐ 見つけたデバイスと BLE接続を確立する 🔐 確かめる 「この人は鍵を開けてよい人か」をデジタルキーで認証する 📨 お願いする 施錠・解錠などのコマンドを送る 👋 切る 用が済んだら接続を切る ワクワクしたところ : まるで会話の様な形で処理が展開される。 19
  10. ワクワク②:電波の向こうの相手と話す作法 返事が「物理の状態」を教えてくれる デバイスからの返事には、いま相手がどんな状態か が表れている。 返事に合わせて、次の行動を変える。 返事 相手の状態 次の行動 `already done`

    もう開いている 成功として終わる `busy` 別の動作中で手が離せない 少し待ってもう一度 認証エラー 鍵が合わない 何度やっても同じなのでやめる ワクワクしたところ : エラーを失敗でひとまとめにせず、状態を読んで振る舞いを変える 。 ※改めて感じるのは本当に「人間との会話」と似ていると思います。 23
  11. アプリを開かなくても鍵が開く 手ぶら解錠ってどんな体験? スマホをポケットに入れたまま、家に帰るだけで鍵が開く。 🏠 家を出る 🚶 外出中 「いってらっしゃい」 🏡 家に近づく

    🚪 ドアの前 「おかえりなさい」 🔓 自動で解錠 このとき、homehubアプリは… • 画面に出ていない(ポケットの中 or ロック画面のまま) • 起動すらしていないこともある 「閉じているアプリ」が、どうやって鍵を開けるのか? 25
  12. アプリを開かなくても鍵が開く 3つの状態で「帰ってきた」を見極める 手ぶら解錠は、3つの状態を行き来するステートマシン で管理している。 🏠 stayInHome(家にいる) 📍 家の周りの範囲から出た 🚶 checkedOut(外出中)

    → 🔔「いってらっしゃい」 📡 Beacon監視開始 📍 家の周りの範囲に入った → 🔔「おかえりなさい」 🏡 checkedIn(帰宅) 📶 ドアのすぐ近くでロックの電波を検知 🔓 自動解錠 26 🏠 stayInHome にリセット → 📱 BLE接続
  13. アプリを開かなくても鍵が開く 閉じているアプリはOSに起こしてもらう アプリが自分で見張り続けることはできない。 そこで「この範囲に入ったら教えて」 とOSにお願いしておく。 ① アプリが起動しているうちに、 OS にお願いしておく 家の周り200mに入ったら教えて

    ② アプリは閉じられる(ユーザーはスマホをポケットへ) ③ 範囲に入ると、 OS がアプリをバックグラウンドで起こす 入ったよ! ワクワクしたところ : 見張りは OS に任せて、アプリは起こされたときだけ働く 。 27 BLE接続
  14. アプリを開かなくても鍵が開く iOS: Flutterの準備ができるまで「取っておく」 iOSではOS がアプリを起こした直後、Flutterの準備より先にお知らせが届いてしまうこと がある。 OSがアプリを起こす Swift: 「範囲に入った」お知らせが届く Dartはまだ準備中...

    👉 いったん配列に取っておく 📦 Dart: 準備完了!「お知らせを流していいよ」 👉 取っておいたお知らせを、まとめて Dartへ 📦 → 📱 ワクワクしたところ : ネイティブとFlutterの “起きる順番のズレ ” を、お知らせを取っておくだけのシンプルな仕組みで 埋めている。 28
  15. まとめ 3つのワクワクの振り返り ワクワクしたこと 支えていた仕組み ① Flutterのボタンが鍵を回す 名前で届くお願い( MethodChannel)+ あとから届くお知らせ( EventChannel)を

    `async*` でつなぐ ② 電波の向こうの相手と話す作法 探す→つなぐ→確かめる→お願い→切る、を`withConnection`で仕組みにする ③ アプリを開かなくても鍵が開く OSに起こしてもらい、 3つの状態と何重もの確認で「帰ってきた」を見極める 1本の通り道(MethodChannel + EventChannel) どの鍵でも同じ書き方で開けられる BLE の会話を安全に始めて、必ず終わらせる バックグラウンドでも、 OSと協力して鍵を開ける 33
  16. まとめ FlutterとIoT初心者だった自分が感じたこと 1. Flutter はハードウェアともちゃんと話せる Platform Channelの先には、Bluetooth・位置情報・バックグラウンド実行といったOS の機能と、物理デバイスの世 界が広がっている。 2.

    ネイティブ連携のコードは「名前」から辿ると読める `invoke("Controller.method")` の名前を手がかりに、Dart → Swift / Kotlin と辿っていくと、未知のコードでも全体 がつかめた。 3. 見慣れた道具の組み合わせでできている `async*`・`sealed class`・`try-finally`・ステートマシン。特別な魔法ではなく知っている道具の組み合わせ で物理の 世界を動かしている。 「難しそう」と思っていたIoT × Flutterは、知ってみるとワクワクする世界でした。 34