FOR IT
IT管理者の方へ:スマートポインターのしくみ(1ページ資料)
スマホとPCを直接つなぐプレゼンリモコン。スマホとPCの接続にWi-Fi・サーバー・アカウント不要、拡張機能の権限は"storage"だけで、動くのはGoogleスライド™のページだけ。
1. 構成
データの流れ
iPhoneアプリペリフェラル。モーションセンサーでポインター位置を計算
Bluetooth Low Energy
iPhone→PCの一方向(通知)
iPhone→PCの一方向(通知)
PCのChrome拡張機能セントラル。接続ウィンドウで受信
ページ内で処理
ポインター表示/進む・戻る
ポインター表示/進む・戻る
Googleスライドのタブコンテンツスクリプトは
docs.google.com/presentation/* だけ- 当方のサーバーなし
- アカウント登録なし
- アプリと拡張機能のコードはネットワーク接続を開きません
- 機器は利用者が毎回Chromeの選択画面で選択
- 当方のサーバーはありません。アカウント登録もありません。
- iPhoneが周辺機器(ペリフェラル)、PCのChromeが接続する側(セントラル)です。接続にはChromeのWeb Bluetooth API を使い、利用者が毎回Chromeの選択画面で機器を選びます。
2. Bluetoothで流れるデータ
iPhone → PC(通知):1メッセージ20バイト以下
| 種類 | 内容 | 頻度 |
|---|---|---|
| POINTER | 画面に対する相対座標 x・y(0〜65535)、表示/非表示フラグ、ポインターの大きさ、iPhone側の送信時刻(ミリ秒、65,536ミリ秒で一巡)、連番 | パッドを押している間、最大60回/秒 |
| COMMAND | 次へ/前へ(先頭・最後・黒画面・白画面・スライド指定は将来用に予約、v1.0では未使用) | 操作のたび |
| HEARTBEAT | 電池残量(%)、本体の温度状態(4段階)、アプリが前面か、パッド押下中か | 1秒ごと |
接続時に1回、PCが読み取る情報(INFO、iPhone→PC):200バイト以下のJSON。例:{"proto":1,"minor":1,"app":"1.0.0","platform":"ios","code":"SP-1A2B","caps":["rel","cmd.nav"]}
- 流れないもの:スライドの内容、画面の映像、音声、カメラ映像、連絡先、位置情報、Apple ID、利用者の氏名。
- PC→iPhoneのアプリケーションデータはありません。 PCが送るのは、通知の購読とINFOの読み取り要求だけです。
- 接続待ちの間:iPhoneは、サービスUUID と表示用コード(
SP-+ランダムな16進4桁、初回起動時に生成)を広告(アドバタイズ)します。PCから見つけられるのは、アプリが前面にあるときだけです(バックグラウンドでは、iOSが表示用コードを広告から外し、サービスUUIDもPCからは見えない「オーバーフロー領域」に移します)。 - Chromeの選択画面:iPhone本体の名前(利用者が設定したもの)が表示されることがあります。これはiOSが公開するもので、アプリは送っていません。
3. ネットワーク通信
- アプリと拡張機能のコードは、ネットワーク接続を一切開きません。 fetch、XMLHttpRequest、WebSocket、URLSession、アクセス解析SDK、クラッシュ収集SDK、サードパーティSDKは含みません。
- 例外(利用者の操作によるもの):ヘルプ、ポリシー、ご意見フォーム、「登壇で使いました」フォームへのリンクは、利用者がクリック/タップしたときにブラウザで開きます。レビュー依頼はAppleの標準機能(StoreKitのレビュー依頼)です。アンインストール時にページを開く設定(
setUninstallURL)は使いません。 - OSとブラウザ自身の通信:Chrome ウェブストアとApp Storeによる更新確認、Googleスライド自体の通信は、通常どおり行われます。Googleスライドはインターネット接続が必要です(オフラインアクセス設定時を除く)。
4. 権限
Chrome拡張機能(Manifest V3)
求めるもの
storage- サイトへのアクセス:
docs.google.com/presentation/*だけ
求めないもの
host_permissionstabsscriptingdebuggerwebRequest<all_urls>- その他のサイト
拡張機能が求める権限は storage だけで、動くのはGoogleスライドのページだけです。
iPhoneアプリ
求めるもの
- Bluetooth
- モーションセンサー(iOSでは許可不要)
bluetooth-peripheral
求めないもの
- カメラ
- マイク
- 位置情報
- 連絡先
- 写真
- ローカルネットワーク
- 通知
Bluetoothは接続ごとに利用者が選ぶ
Web Bluetoothは、利用者がChromeの選択画面で機器を選んだときだけ接続します。OSのペアリングは行いません。iPhoneは最初に接続したPC1台にだけ送信し、2台目の接続には警告を出します。
| 対象 | 求めるもの | 求めないもの |
|---|---|---|
| iPhoneアプリ | Bluetooth(NSBluetoothAlwaysUsageDescription)。モーションセンサー(iOSでは許可不要)。バックグラウンドモード bluetooth-peripheral(短いアプリ切替の間、接続を保つため。バックグラウンドではポインターを送りません) | カメラ、マイク、位置情報、連絡先、写真、ローカルネットワーク、通知 |
| Chrome拡張機能(Manifest V3) | permissions: storage だけ。コンテンツスクリプトは https://docs.google.com/presentation/* だけで動作 | host_permissions、tabs、scripting、debugger、webRequest、<all_urls>、その他のサイトへのアクセス |
- インストール時の表示:コンテンツスクリプトがGoogleスライドで動くため、Chromeは「docs.google.com 上のデータの読み取りと変更」といった趣旨の確認を表示します。拡張機能がそこで行うのは、スライドショーの判定、スライド番号の読み取り、ポインターの描画、矢印キーのイベント送出だけです。スライドの本文や画像は読み取りません。
- App Storeのプライバシー表示:「データの収集なし」。プライバシーマニフェストでは UserDefaults(理由コード CA92.1)だけを申告。輸出規制:
ITSAppUsesNonExemptEncryption = NO。 - ストア版の範囲:自己テスト機能や動作記録機能は社内ビルドだけにあり、App Store版・Chrome ウェブストア版には含みません。設定画面の「詳細設定」は通常の設定項目です。
5. 端末に保存されるデータ
| 場所 | 内容 | 消えるとき |
|---|---|---|
| iPhone(UserDefaults) | 設定、表示用コード、接続成功回数 | アプリの削除 |
PCのChrome(chrome.storage.local) | 設定、接続ログ(時刻、受信数、遅延統計、電池・温度、操作履歴。スライドの内容は含まない) | ログは24時間。拡張機能の削除で全部 |
6. 無線区間についての事実と制限
- 通信は暗号化されていません。OSのペアリング(ボンディング)も行いません。ペアリングの確認画面を出さないための設計です。
- 近くの第三者が受信できるのは第2章の内容です。スライドの内容は含みません。
- v1.0 には接続相手の認証がありません。なりすまし機器が同じ名前を名乗った場合、利用者がそれを選ぶと、スライド送りやポインター表示を操作される可能性があります。対策は、利用者がアプリに表示された自分のコードを選ぶことです。iPhoneは最初に接続したPC1台にだけ送信し、2台目の接続には警告を出します。
- 将来、QRコードで共有する鍵によるメッセージ認証を、今の方式と互換のまま追加できるよう、形式を予約しています(提供時期は未定)。
7. 組織のポリシーとの関係(Chrome)
| ポリシー | 影響 | 対応 |
|---|---|---|
DefaultWebBluetoothGuardSetting = 2(ブロック) | Web Bluetoothが全面的に使えず、スマートポインターは接続できません | 3(確認して許可)または未設定が必要です。Web Bluetooth には、特定のサイトや拡張機能だけを許可するポリシーがありません(2026-09-25時点、Chromiumのポリシー定義で確認) |
ExtensionInstallBlocklist = * | 拡張機能を入れられません | ExtensionInstallAllowlist に拡張機能のIDを追加(IDは公開時に掲載します) |
ExtensionInstallForcelist | 配布したい場合に使えます | 値:拡張機能のID;https://clients2.google.com/service/update2/crx(IDは公開時に掲載します) |
ExtensionSettings | 上記と同じ設定が可能。runtime_blocked_hosts に docs.google.com を含めると動作しません。blocked_permissions に storage を含めると動作しません | 必要に応じて除外 |
ExtensionAllowedTypes | 種類を制限している場合 | extension を含める |
- Microsoft Edge:Chrome ウェブストアからインストールできますが、動作確認はしていません。Edgeにも同名のポリシーがあると考えられますが、未確認です。
- OS・MDM:PCのBluetoothが無効化されている場合や、MDMで会社支給iPhoneのApp StoreやBluetoothが制限されている場合は使えません。
- v1.0 には、管理者が設定を事前配布する機能(
chrome.storage.managed)はありません。
8. 既知の制限
- 対象はPCのChromeで開いたGoogleスライドだけです(PowerPoint、Keynote、Safari、Firefoxは非対応)。
- PC:macOS、Windows 10(1703以降)・11 のChrome。Windowsは、3台のWindowsノートPCで動作報告がそろうまで「ベータ」です。LinuxのChromeはWeb Bluetoothが実験的機能のため非対応です。PCにBluetooth LEが必要です(デスクトップPCはUSBアダプターが必要な場合があります)。
- iPhone:iOS 17以降。アプリが前面にないとPCから見つかりません。
- 切断されると拡張機能は約15秒間、自動で再接続を試みます。それより長い中断のあとは、選択画面で選び直しが必要です(iOSのアドレス変更とChromeの仕様のため)。
- 遅延は、PCのOSが決める接続間隔に左右されます。
- Googleスライドの公開されていない動作に依存しています。Googleの変更で操作が効かなくなった場合も、ポインターは使い続けられる設計で、修正はストアの更新で配布します。
- 一度に接続できるのは、iPhone 1台とPC 1台です。
- 接続ウィンドウは発表中も開いたままにする必要があります(最小化は可)。
9. ご自身で確認する方法
- 拡張機能:
chrome://extensionsの「詳細」で権限とサイトへのアクセスを確認できます。コードはビルドなしのJavaScriptなので、インストールされたフォルダでそのまま読めます。接続ウィンドウでデベロッパーツールの「ネットワーク」を開くと、通信が発生しないことを確認できます。 - iPhoneアプリ:App Storeのプライバシー表示と、iPhoneの「設定」>「プライバシーとセキュリティ」>「Appプライバシーレポート」(オンにした後の、アプリごとのネットワーク通信先を表示)で確認できます。
関連資料:プライバシーポリシー/利用規約/確認済み環境/チームでのご利用