Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
スマートロックを支えるFlutter × ネイティブ連携の実践 / Flutter and N...
Search
株式会社ビットキー / Bitkey Inc.
PRO
October 28, 2026
Technology
7
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スマートロックを支えるFlutter × ネイティブ連携の実践 / Flutter and Native Integration in Practice: Powering Smart Locks
登壇者名:酒井 文也
登壇したイベントタイトル:FlutterKaigi 2026
登壇したイベントのURL:
https://2026.flutterkaigi.jp/
株式会社ビットキー / Bitkey Inc.
PRO
October 28, 2026
More Decks by 株式会社ビットキー / Bitkey Inc.
See All by 株式会社ビットキー / Bitkey Inc.
関数型ドメインモデリングの理想と現実 / Domain Modeling Made Functional: Ideals vs. Reality
bitkey
PRO
0
27
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
260
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
480
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
240
iOS/Androidの二刀流エンジニアがFlutter & TypeScriptへ越境後の現在地 - Flutterがメインになって見えた景色と現在の醍醐味 / Dual-Platform Mobile Engineer Shifts to Flutter & TypeScript - The View and Real Thrill of Going Flutter-First
bitkey
PRO
0
670
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
610
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
690
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
400
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
370
Other Decks in Technology
See All in Technology
ビジネス部門からPOを迎えての半年間の進歩と課題
zozotech
PRO
0
110
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
260
撮るだけでは終わらない。ソニーが挑むB2Bカメラソリューション開発
sony
0
110
AWS Continuum for Penetration Testing に Deep Dive してみる
asanoharuki
1
1.3k
LLM-as-a-Judgeは本当に信頼できるのか――評価器を評価する話
taka_aki
3
1.1k
(swiftc) NonCopyableとライフタイム修飾子
teamhimeh
0
130
顧客価値を追いかけたら、プライシングにたどり着いた
sansantech
PRO
2
1k
sue445's proposals 2026
sue445
0
140
「Learning Outcome」を書きたくない私が、Learning Outcomeと折り合いをつけるまで
mhlyc
0
240
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
220
ストレスなくAIと付き合いたい!こんなときどうしてる?
namiki64
4
690
導入から定着へ ~コーディングエージェントを日常業務に組み込む実践知~
yukisakai1225
0
230
Featured
See All Featured
How to make the Groovebox
asonas
2
2.5k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
490
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
290
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Product Roadmaps are Hard
iamctodd
55
13k
エンジニアに許された特別な時間の終わり
watany
109
250k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
The Invisible Side of Design
smashingmag
301
52k
First, design no harm
axbom
PRO
2
1.4k
Documentation Writing (for coders)
carmenintech
77
5.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Transcript
スマートロックを支えるFlutter × ネイティブ連携の実践 株式会社ビットキー 酒井文也 2026/10/30
自己紹介 酒井 文也 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」のモバイルアプリ開発を担当
自己紹介 私の現在地 Flutter歴 = 社歴 (現在約 9ヶ月) 🔰 入社するまでFlutterもIoTもほぼ触ったことがありませんでした...。 ❌「この設計が正解です」
⭕「こんな仕組みで動いているのか!」 FlutterもIoTも初心者だった自分がプロダクトコードを読んでワクワクした事をお裾分けしたい 3
今日のアジェンダ 入社して9ヶ月、コードを読んで「こうなってたのか!」 とワクワクしたことを3つ紹介します。 4 1. 本題の前に - 「何の話?」を少しだけ補足 2. ワクワク①
- Flutterのボタンが玄関の鍵を回すまで 3. ワクワク② - 電波の向こうの相手と話す作法 4. ワクワク③ - アプリを開かなくても鍵が開く 5. まとめ - 9ヶ月の自分が持ち帰ったこと
Mission・Vision つなげよう。 人は、もっと自由になれる。 Bitkey Recruiting Book © Bitkey inc All
rights reserved.
現在、事業展開している2つのプロダクト 現在は「暮らし」「働く」という2つの事業領域において、 hubシリーズ(プロダクト群)をリリースし、 様々なステークホルダーに対して、プラットフォーム・プロダクト・サービスを展開しています。 デリバリー会社 暮らしサービス オフィス テナント ビル(オーナー) ワーカー
居住者 マンション オーナー デベロッパー 不動産管理会社 フレキシブル オフィス 管理組合 対象カスタマー/ユーザー テンポラリーユー ス
homehubは「暮らし」に関わる様々な体験を実現する。 その中心にあるのがスマートロック 「暮らし」
本題の前に homehubアプリとその相手 アプリでできること • ボタンひとつで施錠・解錠 🔓 • 近づくだけで解錠する”手ぶら解錠”🚶 • 外出先からの遠隔操作
🌐 アプリの相手は、画面の向こうの物理デバイス 🔓 スマートロック ①BLE直接 homehubアプリ 8 ②ゲートウェイ経由 📶 WiFi/LTE 🔓 スマートロック ③位置情報+BLE 📍 帰宅を検知 🔓 スマートロック ※自社製ロックに加えて、ベンダーも通信仕様も異なる多様なスマートロックとつながる。
本題の前に 入社して最初に驚いたこと 入社前の自分のイメージ • Flutter = UIを作るフレームワーク • ハードウェアを動かすならネイティブで書くものでは...? 実際にコードを開いてみると
... • Flutter アプリから多種多様なスマートロックを動かしている • しかもそのやり取りは1本の通り道( Method Channel)にまとまっていた IoTってFlutterでも動くんだ! という発見と驚き 今日はこの通り道の先で何が起きているのかを、9ヶ月の自分が知った順番でお話しします。 9
本題の前に 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
ワクワク①:Flutterのボタンが玄関の鍵を回すまで 1本の通り道をどうやって色々なデバイスで使い分けているのか 11
ワクワク①:Flutter のボタンが玄関の鍵を回すまで ボタンを押してから鍵が開くまで ユーザーにとっては「ボタンを押すだけ」。その裏側ではこの様な事が起きている。 📱 Flutter (Dart) 🍎 🤖 ネイティブ
① “開けて”をお願い ② 宛先を見て担当者へ 振り分ける (Method Channel) ⑥ 結果を受け取って 画面に反映 ③ Bluetoothでコマンド送信 ④ 鍵を回す ⑤ “開いた”をお知らせ 応答 (Event Channel) ポイント : Dart側からは ”お願いする” と ”お知らせを待つ” の2つしかしていない。 12 🔒 スマートロック
ワクワク①:Flutter のボタンが玄関の鍵を回すまで お願いは「名前」で届く すべてのお願いは "担当.やること " という名前付きのメッセージ としてMethodChannelを通る。 13
ワクワク①:Flutter のボタンが玄関の鍵を回すまで お願いは「名前」で届く すべてのお願いは "担当.やること " という名前付きのメッセージ としてMethodChannelを通る。 💁 命名例
"Scanner.startScanSession" スキャン担当へ "Connector.connectPeripheral" 接続担当へ "Commands.LockDevice.turnThumbturn" "Geofence.addRegion" コマンド担当 位置情報担当へ ワクワクしたところ : 通り道は1本のまま名前を増やすだけで機能が増やせる 。 ※ネイティブ側は名前を見て担当者に振り分けるだけ。 14 鍵の操作担当へ
ワクワク①:Flutter のボタンが玄関の鍵を回すまで 結果はあとから届く: async*がつなぐ Bluetoothの操作は時間がかかる。 invoke()の戻り値は「受け付けました」で、結果はあとから EventChannelで届く。 15
ワクワク①:Flutter のボタンが玄関の鍵を回すまで 結果はあとから届く: async*がつなぐ Bluetoothの操作は時間がかかる。 invoke()の戻り値は「受け付けました」で、結果はあとから EventChannelで届く。 ワクワクしたところ : “お願い”
と ”お知らせ待ち” がひとつの関数の中に自然に収まる 。 ※使う側はチャネルの存在を意識しない。 16
ワクワク①:Flutter のボタンが玄関の鍵を回すまで どの鍵でも同じ書き方で開けられる ベンダーも通信方式も違うのに、アプリ側のコードはほぼ同じ 。 ワクワクしたところ : 違いは ”下の層” に閉じ込めて、アプリ側は
”何をしたいか ” だけを書く 。 17
ワクワク②:電波の向こうの相手と話す作法 Bluetooth (BLE) 接続の始まりから終わりまで 18
ワクワク②:電波の向こうの相手と話す作法 BLE接続の始まりから終わりまで 鍵を1回開けるだけでも、BLEではこれだけの段階を踏む 。 🔍 探す 🔗 つなぐ 🔐 確かめる
📨 お願いする 👋 切る スキャン 接続 認証 コマンド送信 切断 段階 やっていること 🔍 探す 周りの電波から目的のデバイスを見つける 🔗 つなぐ 見つけたデバイスと BLE接続を確立する 🔐 確かめる 「この人は鍵を開けてよい人か」をデジタルキーで認証する 📨 お願いする 施錠・解錠などのコマンドを送る 👋 切る 用が済んだら接続を切る ワクワクしたところ : まるで会話の様な形で処理が展開される。 19
ワクワク②:電波の向こうの相手と話す作法 「つないだら、必ず切る」を仕組みにする 接続しっぱなしは、電池にもほかの利用者にもやさしくない。 そこで`withConnection`という独自で共通の書き方を用意している。 20
ワクワク②:電波の向こうの相手と話す作法 「つないだら、必ず切る」を仕組みにする 接続しっぱなしは、電池にもほかの利用者にもやさしくない。 そこで`withConnection`という独自で共通の書き方を用意している。 接続にかかる時間はデバイスの種類によって違うので、待ち時間もデバイスに合わせて調整している ワクワクしたところ : `try-finally`で、物理デバイスとの ”後片付け ”
を忘れない仕組み にしている。 21
ワクワク②:電波の向こうの相手と話す作法 返事が「物理の状態」を教えてくれる デバイスからの返事には、いま相手がどんな状態か が表れている。 返事に合わせて、次の行動を変える。 22
ワクワク②:電波の向こうの相手と話す作法 返事が「物理の状態」を教えてくれる デバイスからの返事には、いま相手がどんな状態か が表れている。 返事に合わせて、次の行動を変える。 返事 相手の状態 次の行動 `already done`
もう開いている 成功として終わる `busy` 別の動作中で手が離せない 少し待ってもう一度 認証エラー 鍵が合わない 何度やっても同じなのでやめる ワクワクしたところ : エラーを失敗でひとまとめにせず、状態を読んで振る舞いを変える 。 ※改めて感じるのは本当に「人間との会話」と似ていると思います。 23
ワクワク③:アプリを開かなくても鍵が開く バックグラウンドで動く「手ぶら解錠」の仕組み 24
アプリを開かなくても鍵が開く 手ぶら解錠ってどんな体験? スマホをポケットに入れたまま、家に帰るだけで鍵が開く。 🏠 家を出る 🚶 外出中 「いってらっしゃい」 🏡 家に近づく
🚪 ドアの前 「おかえりなさい」 🔓 自動で解錠 このとき、homehubアプリは… • 画面に出ていない(ポケットの中 or ロック画面のまま) • 起動すらしていないこともある 「閉じているアプリ」が、どうやって鍵を開けるのか? 25
アプリを開かなくても鍵が開く 3つの状態で「帰ってきた」を見極める 手ぶら解錠は、3つの状態を行き来するステートマシン で管理している。 🏠 stayInHome(家にいる) 📍 家の周りの範囲から出た 🚶 checkedOut(外出中)
→ 🔔「いってらっしゃい」 📡 Beacon監視開始 📍 家の周りの範囲に入った → 🔔「おかえりなさい」 🏡 checkedIn(帰宅) 📶 ドアのすぐ近くでロックの電波を検知 🔓 自動解錠 26 🏠 stayInHome にリセット → 📱 BLE接続
アプリを開かなくても鍵が開く 閉じているアプリはOSに起こしてもらう アプリが自分で見張り続けることはできない。 そこで「この範囲に入ったら教えて」 とOSにお願いしておく。 ① アプリが起動しているうちに、 OS にお願いしておく 家の周り200mに入ったら教えて
② アプリは閉じられる(ユーザーはスマホをポケットへ) ③ 範囲に入ると、 OS がアプリをバックグラウンドで起こす 入ったよ! ワクワクしたところ : 見張りは OS に任せて、アプリは起こされたときだけ働く 。 27 BLE接続
アプリを開かなくても鍵が開く iOS: Flutterの準備ができるまで「取っておく」 iOSではOS がアプリを起こした直後、Flutterの準備より先にお知らせが届いてしまうこと がある。 OSがアプリを起こす Swift: 「範囲に入った」お知らせが届く Dartはまだ準備中...
👉 いったん配列に取っておく 📦 Dart: 準備完了!「お知らせを流していいよ」 👉 取っておいたお知らせを、まとめて Dartへ 📦 → 📱 ワクワクしたところ : ネイティブとFlutterの “起きる順番のズレ ” を、お知らせを取っておくだけのシンプルな仕組みで 埋めている。 28
アプリを開かなくても鍵が開く iOS: Flutterの準備ができるまで「取っておく」 iOSではOS がアプリを起こした直後、Flutterの準備より先にお知らせが届いてしまうこと がある。 29
アプリを開かなくても鍵が開く Android: ForegroundServiceで「見守り続ける」 Androidでは、範囲に入ったら ForegroundService(通知を出しながら動き続けるサービス)を起動して、ドアに近づ くのを見守る。 - 電波の強さ( RSSI)でドアのすぐ近くまで来たかを判断 -
見守りには有効期限があり、 ずっと動き続けることはない コードの続きは次のスライドで 30
アプリを開かなくても鍵が開く Android: ForegroundServiceで「見守り続ける」 Androidでは、範囲に入ったら ForegroundService(通知を出しながら動き続けるサービス)を起動して、ドアに近づ くのを見守る。 ワクワクしたところ : 「近づいた」を電波の強さ という物理量で判断している。
31
まとめ 9ヶ月の自分が持ち帰ったこと 32
まとめ 3つのワクワクの振り返り ワクワクしたこと 支えていた仕組み ① Flutterのボタンが鍵を回す 名前で届くお願い( MethodChannel)+ あとから届くお知らせ( EventChannel)を
`async*` でつなぐ ② 電波の向こうの相手と話す作法 探す→つなぐ→確かめる→お願い→切る、を`withConnection`で仕組みにする ③ アプリを開かなくても鍵が開く OSに起こしてもらい、 3つの状態と何重もの確認で「帰ってきた」を見極める 1本の通り道(MethodChannel + EventChannel) どの鍵でも同じ書き方で開けられる BLE の会話を安全に始めて、必ず終わらせる バックグラウンドでも、 OSと協力して鍵を開ける 33
まとめ FlutterとIoT初心者だった自分が感じたこと 1. Flutter はハードウェアともちゃんと話せる Platform Channelの先には、Bluetooth・位置情報・バックグラウンド実行といったOS の機能と、物理デバイスの世 界が広がっている。 2.
ネイティブ連携のコードは「名前」から辿ると読める `invoke("Controller.method")` の名前を手がかりに、Dart → Swift / Kotlin と辿っていくと、未知のコードでも全体 がつかめた。 3. 見慣れた道具の組み合わせでできている `async*`・`sealed class`・`try-finally`・ステートマシン。特別な魔法ではなく知っている道具の組み合わせ で物理の 世界を動かしている。 「難しそう」と思っていたIoT × Flutterは、知ってみるとワクワクする世界でした。 34
2026年12月2日(水)19:00 より 「ビルまるごと」プロダクトを体験できる オフィスツアーを開催します!