コンパニオンアプリ — Apple WatchやWear OSなどのウェアラブルデバイス向けのコンパニオンアプリケーションで、スマートフォンのメインアプリケーションと連携して動作します。コンパニオンアプリはWatchConnectivity(iOS)またはWearable Data Layer(Android)を介してデータを同期し、時計に通知を表示し、自律的に機能することができます。開発はwatchOS向けにSwift、Wear OS向けにKotlinで行われます。詳細はWatchConnectivity Docsをご覧ください。
重要なポイント
コンパニオンアプリ — Apple WatchまたはWear OSのウェアラブルデバイス向けアプリケーションで、メインのiOSまたはAndroidアプリと共に提供されます。主な目的は手首に機能を拡張することです:素早い情報表示、メッセージへの返信、音楽の制御、ワークアウトの追跡。開発者がビルドに含めた場合、スマートフォンにメインアプリをインストールするとコンパニオンアプリは自動的に時計にインストールされます。
アーキテクチャ コンパニオンアプリは2つのコンポーネントで構成されます:iOS/Androidアプリ(メイン)とwatchOS/Wear OSアプリ(コンパニオン)。それらの間の通信はシステムAPIを介して行われます:Apple向けはWatchConnectivity、Google向けはWearable Data Layer。データはBluetoothまたはWi-Fiを介してバックグラウンドで転送され、ユーザーは同期プロセスを見ることはありません。時計のアプリはモバイルとは異なる、小さな画面に適応した独自のUIを持つことができます。
コンパニオンアプリの種類 は電話への依存度によって異なります。ミラーリングアプリ は電話のデータのコピーを表示し、接続なしでは動作しません。分離型アプリ は独自のロジックを持ち、データをキャッシュし、電話から切断されても一部の機能を維持します。独立型アプリ(watchOS 6+およびWear OS 3+)は電話なしでインストールでき、独自のネットワークアクセスで完全に自律的に動作します。
WatchConnectivity — iPhoneとApple Watch間の双方向通信用のAppleフレームワーク。4つのデータ転送メカニズムを提供します:Application Context(最後に知られた状態)、File Transfer(任意のサイズのファイル)、User Info(配信保証付きの辞書)、Interactive Messaging(リアルタイム双方向通信)。システムは距離と信号品質に基づいて自動的にBluetoothまたはWi-Fiを選択します。
import WatchConnectivity
class PhoneSessionManager: NSObject, WCSessionDelegate {
func activateSession() {
WCSession.default.delegate = self
WCSession.default.activate()
}
func sendWorkoutData(_ data: WorkoutData) {
let dict = ["heartRate": data.heartRate,
"calories": data.calories] as [String: Any]
WCSession.default.transferUserInfo(dict)
}
func session(_: WCSession,
didReceiveUserInfo: [String: Any]) {
DispatchQueue.main.async {
NotificationCenter.default.post(
name: .workoutDataReceived,
object: didReceiveUserInfo)
}
}
}
Interactive Messaging — リアルタイム配信が保証された唯一のWatchConnectivityメカニズム。接続がアクティブな場合、メッセージは200~500ミリ秒以内に送信され応答を受信します。即時応答が必要なアクションに使用されます:ワークアウトの開始、支払いの確認、スマートホームのドアの開錠。両方のデバイスでセッションがアクティブである必要があります — 時計がロックされているかアプリがバックグラウンドにある場合、配信は保証されません。
File Transfer API は大量のデータ(画像、音声ファイル、エクスポートされたワークアウト)向けに設計されています。アプリが閉じられていてもファイルはバックグラウンドで転送されます。制限はキュー内で最大10件の同時転送です。Application Context は最も経済的なメカニズムです:最後の状態のみを送信し、以前の未送信コンテキストはキャンセルされます。設定や現在のステータスの同期に最適です。
Wearable Data Layer — AndroidデバイスとWear OS時計間でデータを同期するためのGoogle Play ServicesのAPI。3つのプロトコルを提供します:DataItem(キーと値のペアの同期)、MessageClient(単方向メッセージ)、ChannelClient(ストリーミングデータ)。DataItemはGoogle Cloudを介して自動的に同期されます — 電話が利用できない場合、接続が復元されるとデータが配信されます。
class WearableSyncService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
dataEvents.forEach { event ->
when (event.type) {
DataEvent.TYPE_CHANGED -> {
val uri = event.dataItem.uri
val path = uri.path // /workout/heartrate
val data = DataMapItem
.fromDataItem(event.dataItem)
.dataMap
val bpm = data.getInt("bpm")
updateUI(bpm)
}
}
}
}
}
MessageClient — パスとバイト配列を含む単方向メッセージを送信します。「ワークアウトを開始」や「音楽を一時停止」などのコマンドに使用されます。デバイスが接続されていればメッセージは確実に配信されます。Wear OSでメッセージを受信するには、WearableListenerServiceを実装してマニフェストに登録します。MessageClientは自動キャッシングをサポートしていません — 時計が切断されているとメッセージは失われます。
ChannelClient — ストリーミングデータ(オーディオ、ビデオ、連続センサーストリーム)のためのプロトコル。バイト配列が送信される双方向チャネルを開きます。Wear OS 2.0+でのみサポートされています。ChannelClientは、Bluetooth経由の通話のために電話から時計へ音声を送信したり、外部Bluetoothセンサー(心拍数モニター、サイクルコンピューター)からのデータを電話経由で時計に中継するのに便利です。
自律動作 — コンパニオンアプリが電話接続なしで機能する能力。Cellularモジュール搭載のwatchOSでは、アプリはeSIMを介して直接ネットワークリクエストを送信します。LTE搭載のWear OSでも同様の機能が利用可能です。セルラーモジュールがなくても、時計は電話から最新のデータをキャッシュし、切断時にそれを表示します — ユーザーは最後の同期時点の情報を表示します。
| モード | データ | 可用性 | 例 |
|---|---|---|---|
| オンライン | サーバー/電話からライブ | 完全 | ナビゲーションルート |
| キャッシュ | 電話から最新 | 制限付き | 連絡先リスト |
| オフライン | 時計にローカル | 最小限 | タイマー、ストップウォッチ |
データキャッシング — 自律動作の重要な要素。アプリは最後に受信した状態を時計のローカルストレージに保存する必要があります。watchOSではUserDefaultsまたはCoreDataが使用され、Wear OSではRoom DatabaseまたはDataStoreが使用されます。接続が復元されると、バックグラウンド同期によってキャッシュが更新されます。データが24時間以上古い場合、アプリは「電話の接続を更新してください」というメッセージを表示します。
限られた画面のためのウェアラブルUI — 時計の画面は1.5〜2インチで、コンパニオンアプリのインターフェースは可能な限り簡潔でなければなりません。AppleはwatchOSで1列のNavigationViewを推奨し、GoogleはWear OSでスワイプナビゲーション付きのカードリストを推奨しています。ボタンは快適なタッチのために少なくとも44ptのサイズが必要です。テキスト入力フィールドは避け、既定の返信、音声入力、またはDigital Crownスクロールホイールを使用してください。
エネルギー効率の良い設計 — コンパニオンアプリは数時間で時計のバッテリーを消耗させるべきではありません。最小間隔でバックグラウンド更新を使用してください。watchOSでは、WatchConnectivityはバッテリー残量が少ないと転送を一時停止し、充電後に再開します。Wear OSでは、Wearable Data Layerがエネルギー節約のために小さな転送を自動的に1つにグループ化します。手首の上げ — ユーザーが手首を上げたときのみUIを更新します。
コンパニオンアプリのアーキテクチャ は、接続断の可能性を考慮して設計する必要があります。Repositoryパターンを使用します:電話上の単一のデータソースが時計上のローカルリポジトリと同期します。時計のViewModelはローカルリポジトリを購読し、接続状態に関係なくデータを表示します。接続が復元されると、時計のRepositoryがWatchConnectivityまたはWearable Data Layerを介してデータを要求し、ローカルストレージを更新します。
class WorkoutRepository constructor(
private val localStorage: WorkoutDao,
private val wearableClient: WearableClient
) {
val workoutFlow: Flow<Workout?> = merge(
localStorage.observeWorkout(),
wearableClient.observeWorkout()
.onEach { localStorage.save(it) }
)
}
テスト コンパニオンアプリのテストには、実際の時計またはエミュレーターでの検証が必要です。XcodeはiPhoneシミュレーターとペアリングされたApple Watchシミュレーターをサポートしており、物理デバイスなしでWatchConnectivityをテストできます。Android StudioにはWearable Data LayerをサポートしたWear OSエミュレーターが含まれています。重要なテストケース:転送中の接続断、バッテリー低下、2つのコンパニオンアプリの同時動作、スタンドアロン時計での電話なしのインストール。
コンパニオンアプリの公開 watchOSではApp Storeへの個別のアップロードは不要です — アプリはiOSアプリのバイナリに含まれ、自動的に時計へのインストールが提案されます。Wear OSでは、コンパニオンアプリはGoogle Playに個別に公開されますが、同じパッケージを介してメインアプリにリンクされます。iOSのApp GroupとAndroidのsharedUserIdにより、メインアプリとコンパニオンアプリは共有データストレージを使用できます。
よくある質問
コンパニオンアプリは完全な機能のためにiPhoneまたはAndroidにメインアプリがインストールされている必要があります。通常のスタンドアロン時計アプリ(コンパスやストップウォッチなど)は電話なしで自律的に動作します。コンパニオンアプリは電話とデータを同期し、通知を表示し、クイックアクションを実行できますが、電話なしでは一部の機能を失います。
WatchConnectivityは4つのモードをサポートしています:以前の状態をキャンセルして現在の状態を送信するApplication Context、任意のサイズのファイル用のFile Transfer、配信保証付きのデータ辞書用のUser Info、リアルタイム双方向通信用のInteractive Messaging。データはBluetoothまたはWi-Fiを介して送信され、システムが自動的に最適なチャネルを選択します。
はい、コンパニオンアプリは自律的に動作します — watchOSとWear OSは電話から受信したデータをキャッシュします。セルラーモジュール搭載の時計では、アプリはeSIMまたはLTEを介して直接リクエストを送信します。キャッシュされたデータは接続がなくても表示されます。接続が復元されると、バックグラウンド同期によってキャッシュが更新されます。
最も人気のあるカテゴリ:ワークアウト同期付きフィットネストラッカー、時計からメッセージに返信するメッセンジャー、手首にターンバイターン案内を表示するナビゲーター、再生制御用のミュージックプレーヤー、決済システム、デバイス制御用のスマートホーム、心拍数と血圧用の医療モニターです。
Apple Watchは標準使用でアクティブなコンパニオンアプリで最大18時間の動作を提供します。Wear OSは最大24時間です。WatchConnectivityは低消費電力に最適化されています:バッテリー残量が少ないとデータ転送が一時停止され、時計の充電中に一括同期が実行されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。