スマートフォンのアプリからの通知は、デフォルトではペア設定されているすべてのスマートウォッチにブリッジ(共有)されます。スマートウォッチ アプリを作成する場合、ペア設定されているスマートフォンにもそのアプリが存在すると、ユーザーに通知が重複して届くことがあります。一方はスマートフォン アプリが生成しブリッジした通知、もう一方はスマートウォッチ アプリが生成した通知です。Wear OS には、通知をいつどのようにブリッジするかを制御する機能があります。
通知の重複を避ける
Firebase Cloud Messaging などの外部ソースから通知を作成する場合は、モバイルアプリとウェアラブル アプリのそれぞれが、独自の通知をスマートウォッチに表示することがあります。このような重複を避けるには、ウェアラブル アプリのブリッジをプログラムで無効にします。
ブリッジタグを使用する
モバイルアプリで作成された通知の一部を、ウェアラブル アプリがインストールされたスマートウォッチにブリッジする場合は、ブリッジタグを設定します。
通知にブリッジタグを設定するには、次のコードサンプルに示すように、setBridgeTag(String)
メソッドを使用します。
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setBridgeTag("tagOne") ) .build()
ブリッジを無効にする
一部の通知またはすべての通知について、ブリッジを無効にすることができます。ブリッジを選択的に無効にすることをおすすめします。
一部の通知のブリッジを無効にする
ブリッジを動的に無効にしたうえで、必要に応じタグに基づいて一部の通知を許可することもできます。たとえば、tagOne
、tagTwo
、tagThree
としてタグ付けされている通知を除くすべての通知のブリッジを無効にするには、次の例に示すように BridgingConfig
オブジェクトを使用します。
BridgingManager.fromContext(context).setConfig( BridgingConfig.Builder(context, false) .addExcludedTags(listOf("tagOne", "tagTwo", "tagThree")) .build() )
すべての通知のブリッジを無効にする(非推奨)
注: すべての通知のブリッジを無効にすることはおすすめしません。マニフェストで設定されたブリッジ構成は、スマートウォッチ アプリのインストール後すぐに適用されます。そのため、ユーザーがスマートウォッチ アプリを開いてセットアップしなければ通知を受け取れない場合は、一部の通知が不達になるおそれがあります。
スマートフォン アプリからのすべての通知をブリッジしないようにするには、次の例に示すように、スマートウォッチ アプリのマニフェスト ファイルで <meta-data>
エントリを使用します。
<application> ... <!-- Beware, this can have unintended consqequences before the user is signed-in --> <meta-data android:name="com.google.android.wearable.notificationBridgeMode" android:value="NO_BRIDGING" /> ... </application>
注: 実行時にブリッジ構成を指定すると、Android マニフェスト ファイル内のブリッジ関連の設定がオーバーライドされます。
消去 ID を設定して同様の通知を同期させる
ブリッジモード機能を使用してブリッジを防止している場合、ユーザーのデバイス間で通知の消去操作が同期されません。
しかし、モバイル デバイスとスマートウォッチの両方で作成された類似の通知について、ユーザーが一方の通知を消去したら両方の通知が消去されるようにしたい場合もあります。
NotificationCompat.WearableExtender
でグローバルな一意の ID を設定すると、ある通知が消去されたときに、ペア設定されたスマートウォッチ上で同じ ID を持つ他方の通知も消去することができます。
NotificationCompat.WearableExtender
クラスには、消去 ID を使用するためのメソッドが用意されています。次に例を示します。
fun setDismissalId(dismissalId: String): WearableExtender fun getDismissalId(): String
消去操作を同期するには、setDismissalId()
メソッドを使用します。setDismissalId()
メソッドを呼び出すとき、通知ごとに、グローバルに一意の ID を文字列として渡します。
通知が消去されると、同じ消去 ID を持つ他のすべての通知がスマートウォッチとスマートフォンから消去されます。消去 ID を取得するには、getDismissalId()
を使用します。
次の例では、新しい通知に対しグローバルに一意の ID が指定されているため、消去操作が同期されます。
val notification = NotificationCompat.Builder(context, channelId) // Set other fields ... .extend( NotificationCompat.WearableExtender() .setDismissalId("abc123") ) .build()
注: 消去 ID は、スマートウォッチが Android スマートフォンとペア設定されている場合は機能しますが、iPhone とペア設定されている場合は機能しません。
通知がブリッジされない場合
次の種類の通知はブリッジされません。
Notification.Builder.setLocalOnly(boolean)
で設定されたローカルのみの通知。-
Notification.Builder.setOngoing(boolean)
またはNotification.FLAG_ONGOING_EVENT
で設定された進行中の通知。 -
Notification.FLAG_NO_CLEAR
で設定されたクリア不可の通知。 - 前述のように、対応するウェアラブル アプリで通知ブリッジを無効にしている場合の通知。
ブリッジ通知に関するベスト プラクティス
ブリッジした通知を、ウェアラブル デバイスからプッシュまたは削除するのには時間がかかります。通知を設計する際は、こうした遅延によって予期しない動作が起きないようにする必要があります。以下のガイドラインに沿って設計することで、ブリッジ通知と非同期通知を連携させることができます。
- スマートフォンで通知をキャンセルしても、対応する通知がスマートウォッチでキャンセルされるまでに時間がかかることがあります。その間に、ユーザーがその通知に対するペンディング インテントのいずれかを送信する可能性があります。そのため、通知をキャンセルする場合は、通知のペンディング インテントのレシーバを有効なままにしておき、キャンセルされた通知からのペンディング インテントをアプリで引き続き受信するようにします。
- 通知のスタック全体のキャンセルと再トリガーを同時に行わないでください。実際に変更された通知のみを変更または削除します。これにより、ウェアラブル デバイスのアップデート時の遅延を回避し、アプリがバッテリー駆動時間に及ぼす影響を軽減できます。
設計に関する注意事項
Wear OS の通知には独自の設計ガイドラインがあります。詳しくは、Wear OS の設計ガイドラインをご覧ください。