알림 브리징 옵션

기본적으로 알림은 휴대전화의 앱에서 페어링된 시계로 브리징(공유)됩니다. 시계 앱을 빌드하고 앱이 페어링된 휴대전화에도 있으면 사용자는 중복 알림을 수신할 수도 있습니다. 하나는 휴대전화 앱에서 생성되고 브리징된 알림이고 하나는 시계 앱에서 생성된 알림입니다. Wear OS에는 알림이 브리징되는 방법과 시점을 제어하는 기능이 포함되어 있습니다.

중복 알림 피하기

Firebase 클라우드 메시징과 같은 외부 소스에서 알림을 만드는 경우 모바일 앱과 웨어러블 앱은 각각 시계에 자체 알림을 표시할 수 있습니다. 이러한 종류의 중복을 방지하려면 웨어러블 앱에서 프로그래매틱 방식으로 브리징을 사용 중지하세요.

브리지 태그 사용

웨어러블 앱이 설치된 경우 모바일 앱에서 생성된 알림 중 일부를 시계에 브리징하려면 브리지 태그를 설정합니다.

다음 코드 샘플과 같이 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()

참고: Android 휴대전화에서 시계가 페어링된 경우에는 닫기 ID가 작동하지만 iPhone에서 시계가 페어링된 경우에는 닫기 ID가 작동하지 않습니다.

알림이 브리징되지 않는 경우

다음 유형의 알림은 브리징되지 않습니다.

브리징된 알림에 관한 권장사항

웨어러블 기기에서 브리징된 알림을 푸시하거나 삭제하는 데 시간이 걸립니다. 알림을 디자인할 때 이 지연 시간으로 인해 예기치 않은 동작이 발생하지 않도록 해야 합니다. 다음 가이드라인을 따르면 브리징된 알림이 비동기 알림과 호환됩니다.

  • 휴대전화에서 알림을 취소하면 시계에서 해당하는 알림이 취소되기까지 다소 시간이 걸릴 수 있습니다. 그동안 사용자는 해당 알림에서 대기 중인 인텐트 중 하나를 보낼 수 있습니다. 따라서 취소된 알림에서 대기 중인 인텐트를 앱에서 계속 수신합니다. 알림을 취소할 때 이러한 알림의 대기 중인 인텐트 수신자를 유효한 상태로 유지하세요.
  • 한 번에 전체 알림 스택을 취소하고 다시 트리거하지 않습니다. 실제로 수정된 알림만 수정 또는 삭제하세요. 이렇게 하면 웨어러블 기기를 업데이트할 때 지연 시간을 피할 수 있고 배터리 수명에 미치는 앱의 영향을 줄일 수 있습니다.

디자인 고려사항

Wear OS 알림에는 고유한 디자인 가이드라인이 있습니다. 자세한 내용은 Wear OS 디자인 가이드라인을 참고하세요.