Wear에서 알림에 관한 연결 모드

기본적으로 알림은 호환 전화의 앱에서 페어링된 시계로 연결(공유)됩니다. 독립 실행형 시계 앱을 빌드하고 호환 전화 앱을 가지고 있는 경우, 이 두 앱이 중복 알림을 만들 수 있습니다. Wear OS by Google에는 이러한 중복 알림 문제를 처리하기 위한 기능이 포함되어 있습니다.

다음의 관련 리소스를 참조하세요.

참고: 기기에 알림을 보내려면 Firebase 클라우드 메시징(FCM)을 사용할 수 있습니다. Android, iOS 및 Chrome에서 사용자 만나기를 참조하세요.

개발자는 다음 중 하나 이상을 사용하여 알림 동작을 변경할 수 있습니다.

  • 매니페스트 파일에서 연결 구성 지정
  • 런타임 시 연결 구성 지정
  • 알림 닫기가 기기 간에 동기화되도록 닫기 ID 설정

매니페스트 파일에서 연결 구성 지정

앱의 Android 매니페스트 파일은 해당 스마트폰 앱의 알림이 시계에 연결되지 않아야 함을 나타낼 수 있습니다. 특히 스마트폰 앱에서 알림이 연결되는 것을 방지하려면 시계 앱(예: 독립 실행형 시계 앱)의 매니페스트 파일에서 다음과 같이 <meta-data> 항목을 사용할 수 있습니다.

    com.google.android.wearable.notificationBridgeMode
    

<meta-data> 항목을 <application> 요소의 하위 요소로서 추가합니다. 연결 방지를 위해 항목을 NO_BRIDGING으로 설정합니다.

    <application>
    ...
      <meta-data
        android:name="com.google.android.wearable.notificationBridgeMode"
        android:value="NO_BRIDGING" />
    ...
    </application>
    

<meta-data> 항목을 포함하지 않거나 NO_BRIDGING 대신 BRIDGING의 값을 지정하는 경우 기본 연결 동작이 발생합니다.

매니페스트에 설정된 연결 구성은 시계 앱이 설치되는 즉시 적용됩니다.

런타임 시 연결 구성 지정

런타임 시 연결 구성을 지정하려면 연결 모드 기능을 사용할 수 있습니다. 특히 BridgingManager 클래스를 사용합니다.

연결 모드를 설정할 수 있으며, 선택적으로 BridgingManager 객체를 사용하여 연결 모드에서 제외하는 알림의 태그를 설정할 수 있습니다. 특히, BridgingConfig 객체를 만들고 이 섹션에 나와 있는 것처럼 설정합니다.

런타임 시 연결 구성을 지정하면 Android 매니페스트 파일의 연결 관련 설정이 재정의됩니다.

모든 알림에 관해 연결 사용 안 함

다음과 같이 모든 알림에 관해 연결을 사용하지 않도록 설정할 수 있습니다.

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false).build()
    )
    

자바

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .build());
    

위의 구성을 설정하지 않으면 연결 모드의 기본값은 true입니다.

태그가 지정된 알림 제외

특정 태그가 있는 알림을 제외한 모든 알림에 관해 연결을 사용하지 않도록 설정할 수 있습니다.

예를 들면 foo, bar 또는 baz 태그가 있는 알림을 제외한 모든 알림에 관해 연결을 사용하지 않도록 설정할 수 있습니다.

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTags(listOf("foo", "bar", "baz"))
                    .build()
    )
    

자바

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTags(Arrays.asList("foo", "bar", "baz"))
        .build());
    

또 다른 예로, 특정 태그(예: foo 또는 bar)가 있는 알림을 제외할 수 있습니다.

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTag("foo")
                    .addExcludedTag("bar")
                    .build()
    )
    

자바

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTag("foo")
        .addExcludedTag("bar")
        .build());
    

연결 태그 설정

다음과 같이 setBridgeTag(String) 메서드를 사용하여 알림에 연결 태그를 설정할 수 있습니다.

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setBridgeTag("foo")
            )
            .build()
    

자바

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId)
    // ... set other fields ...
      .extend(
        new NotificationCompat.WearableExtender()
          .setBridgeTag("foo"));
      Notification notification = notificationBuilder.build();
    

기존 앱에서 연결 방지

알림을 받을 때 스마트폰이 연결되어 있지 않으면 연결을 사용하지 않도록 기존 앱에서 이미 설정했을 수 있습니다. 이 경우에도 시계 앱에서 알림이 닫힐 때 다른 기기 전체에서 알림을 닫을 수 있습니다.

연결을 방지하는 기존 방법은 Notification.Builder 클래스를 사용하는 것입니다. setLocalOnly 메서드에서 true를 지정합니다.

그러나 이 방법으로 연결을 방지하는 것이 바람직하지 않을 수 있습니다. 예를 들어, 사용자가 스마트폰 앱은 설치했지만 해당하는 시계 앱은 설치하지 않은 경우, setLocalOnly 메서드는 유용한 알림의 연결을 방지할 수 있습니다. 또한 사용자가 페어링된 여러 시계를 가지고 있지만 모든 시계에 시계 앱을 설치하지는 않았을 수 있습니다.

닫기 ID를 사용하여 알림 닫기 동기화

연결 모드 기능으로 연결을 방지하는 경우, 알림의 닫기(취소)가 사용자의 기기 전체에서 동기화되지 않습니다. 그러나 NotificationCompat.WearableExtender 클래스의 다음 메서드를 사용하면 닫기 ID를 사용할 수 있습니다.

Kotlin

    fun setDismissalId(dismissalId: String): WearableExtender
    fun getDismissalId(): String
    

자바

    public WearableExtender setDismissalId(String dismissalId)
    public String getDismissalId()
    

닫기를 동기화하려면 setDismissalId() 메서드를 사용합니다. setDismissalId() 메서드를 호출할 때 각 알림에 전역적으로 고유 ID를 문자열로서 전달합니다. 알림을 닫으면 시계 및 호환 전화에서 닫기 ID가 동일한 다른 모든 알림도 닫힙니다. 닫기 ID를 검색하려면 getDismissalId()를 사용합니다.

다음 예제에서는 새 알림에 관해 전역적으로 고유 ID가 지정되므로 닫기의 동기화가 사용됩니다.

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setDismissalId("abc123")
            )
            .build()
    

자바

    NotificationCompat.WearableExtender wearableExtender =
      new NotificationCompat.WearableExtender().setDismissalId("abc123");
    Notification notification = new NotificationCompat.Builder(context)
    // ... set other fields ...
      .extend(wearableExtender)
      .build();
    

Android 스마트폰에서 시계가 페어링된 경우에는 닫기 ID가 작동하지만 iPhone에서 시계가 페어링된 경우에는 닫기 ID가 작동하지 않습니다.

연결된 알림에 관한 권장사항

웨어러블 기기에서 연결된 알림을 푸시 또는 제거하려면 시간이 걸립니다. 알림을 디자인할 때 이 지연 시간으로 인해 예기치 않은 동작이 발생하지 않도록 해야 합니다. 아래 가이드라인은 연결된 알림이 비동기 알림과 함께 작동하는지 확인하는 데 도움이 됩니다.

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

디자인 고려 사항

Wear OS 알림에는 고유한 디자인 가이드라인이 있습니다. 자세한 내용은 머티리얼 디자인 페이지를 참조하세요.

  • 페어링된 스마트폰에서 Wear 기기에 연결된 모든 알림은 확장된 알림을 사용합니다.
  • Wear OS에서 지원되는 다양한 알림 템플릿을 언제 사용해야 하는지 알아보려면 알림 패턴 디자인 가이드를 읽어보세요.
  • Wear 알림의 스타일 지정 방법을 알아보려면 알림 스타일 디자인 가이드를 읽어보세요.
  • 채팅 메시지 앱이 있는 경우 알림에 NotificationCompat.MessagingStyle을 사용해야 합니다. Wear는 MessagingStyle 알림에 포함된 채팅 메시지를 사용하여(addMessage() 참조) 확장된 알림에서 풍부한 채팅 앱 같은 환경을 제공합니다.
  • 알림 스트림 내에 인라인 작업(setHintDisplayActionInline(true))을 추가하여, 사용자가 알림에 관해 신속하게 수행할 수 있는 기본 작업을 포함합니다. 알림 스트림 내에서 인라인 작업을 사용하는 좋은 사용 사례로는 문자 메시지에 답장, 피트니스 활동 중지, 이메일 메시지 보관 등이 있습니다.
  • MessagingStyle 알림에 관해 스마트 답장(setAllowGeneratedReplies(true))을 사용합니다.