등록 관리

이 항목에서는 알림 허브에 장치를 등록하여 푸시 알림을 받는 방법을 설명합니다. 이 항목에서는 높은 수준의 등록에 대해 설명한 다음 디바이스를 등록하기 위한 두 가지 주요 패턴인 디바이스에서 알림 허브로 직접 등록하고 애플리케이션 백 엔드를 통해 등록하는 방법을 소개합니다.

장치 등록이란?

등록은 알림 허브의 하위 엔터티로, 장치 PNS 핸들(ChannelURI, 장치 토큰, GCM registrationId와 같은 플랫폼 알림 서비스 핸들)을 태그와 연결하며 템플릿과 연결할 수도 있습니다. 태그는 디바이스 핸들의 정확한 집합에 알림을 올바른 디바이스 핸들 집합에 라우팅하기 위해 사용됩니다. 자세한 내용은 라우팅 및 태그 식을 참조하세요. 템플릿은 등록당 변환을 구현하는 데 사용됩니다. 자세한 내용은 템플릿을 사용하세요.

등록은 일시적인 항목이며, 등록에 포함된 PNS 핸들과 마찬가지로 등록도 만료됩니다. 알림 허브에서 등록의 TTL(Time to Live)을 최대 90일까지 설정할 수 있습니다. 이와 같이 기간이 제한되므로 등록은 주기적으로 새로 고쳐야 하며 중요한 정보를 등록에만 저장해서는 안 됩니다. 또한 등록은 이와 같이 자동으로 만료되므로 모바일 응용 프로그램을 제거할 때 간편하게 정리할 수 있습니다.

등록은 각 장치/채널의 최신 PNS 핸들을 포함해야 합니다. PNS 핸들은 장치의 클라이언트 앱에서만 가져올 수 있으므로 해당 클라이언트 앱에서 등록을 직접 관리하는 방식을 사용할 수 있습니다. 반면 태그와 관련된 비즈니스 논리와 보안을 고려할 때 앱 백 엔드에서 등록을 관리해야 할 수도 있습니다. 다음 섹션에서는 이 두 가지 방식에 대해 설명합니다.

장치에서 등록 관리

클라이언트 앱에서 등록을 관리할 때 백 엔드는 알림 전송만 수행합니다. 클라이언트 앱이 PNS 핸들을 최신 상태로 유지하며 태그에 등록합니다. 다음 그림은 이 패턴을 보여 줍니다.

Registration Management

디바이스는 먼저 PNS에서 PNS 핸들을 검색한 다음 알림 허브에 직접 등록합니다. 등록이 성공한 후 앱 백 엔드는 해당 등록을 대상으로 지정하는 알림을 보낼 수 있습니다. 알림을 보내는 방법에 대한 자세한 내용은 라우팅 및 태그 식을 참조하세요.

참고로 이 경우 수신 권한만 사용하여 디바이스에서 사용자의 알림 허브에 액세스합니다. 자세한 내용은 보안을 참조하세요.

다음 코드는 Notification Hubs API 참조를 사용하여 디바이스를 등록합니다.

await hub.RegisterNativeAsync(channelUri, tags);
[hub registerNativeWithDeviceToken:deviceToken tags:nil completion:^(NSError* error) {
    if (error != nil) {
        NSLog(@"Error registering for notifications: %@", error);
    }
}];

hub.register(regid, tags);

이러한 메서드는 호출되는 디바이스에 대한 등록을 만들거나 업데이트합니다. 즉, 핸들이나 태그를 업데이트하려면 전체 등록을 덮어써야 합니다. 등록은 일시적인 항목이므로 특정 장치에 필요한 최신 태그가 항상 안정적인 저장소(앱 백 엔드 또는 장치의 로컬 저장소)에 저장되어 있어야 합니다. 등록을 업데이트하는 방법에 대한 자세한 예제는 속보 자습서를 참조하세요.

REST API를 사용하여 장치에서 등록할 수도 있습니다. 자세한 내용은 Notification Hubs REST 인터페이스를 사용하는 방법을 참조하세요.

다음 시나리오 자습서에서는 클라이언트에서 등록하는 방법에 대한 단계별 지침을 제공합니다.

템플릿

템플릿을 사용하려는 경우 각 등록은 개별 템플릿을 나타냅니다. 즉, 장치에서 템플릿 두 개를 사용하는 경우에는 자체 PNS 핸들 및 태그 집합을 사용하여 각 템플릿을 독립적으로 등록해야 합니다.

템플릿을 사용하지 않는 기본 등록의 경우에는 템플릿용 등록 메서드를 사용하면 등록이 작성되거나 기존 등록이 업데이트됩니다. 다른 템플릿을 대상으로 지정하려면 등록 시 템플릿 이름을 지정합니다. 같은 장치에 대해 여러 템플릿을 유지 관리하려면 서로 다른 여러 이름을 지정합니다.

중요

템플릿을 사용할 때는 이전 섹션에 나와 있는 것처럼 장치를 등록할 필요가 없습니다. 해당 등록은 즉 플랫폼별 형식으로 전송되는 기본 알림을 보내는 경우에만 사용됩니다.

다음 코드는 Notification Hubs API 참조를 사용하여 디바이스를 등록합니다.

await hub.RegisterTemplateAsync(channelUri, template, templateName, tags);
[hub registerTemplateWithDeviceToken:deviceToken name:templateName jsonBodyTemplate: template expiryTemplate:nil tags:nil completion:^(NSError* error) {
    if (error != nil) {
        NSLog(@"Error registering for notifications: %@", error);
    }
}];

hub.registerTemplate(regId, templateName, template, tags);

각 등록 호출에서는 PNS 핸들 및 선택적 태그 집합과 함께 알림 본문용 템플릿과 템플릿 이름이 제공됩니다. 뿐만 아니라 각 플랫폼에는 템플릿의 일부분인 추가 속성이 포함될 수 있습니다. WNS를 사용하는 Windows 스토어와 MPNS를 사용하는 Windows Phone 8의 경우에는 추가 헤더 집합이 템플릿에 포함될 수 있습니다. APN의 경우 만료 속성을 상수 또는 템플릿 식으로 설정할 수 있습니다.

이러한 템플릿 필드를 수정하는 방법에 대한 지침은 API 참조 또는 Notification Hubs REST API를 참조하세요.

Windows 스토어 앱용 보조 타일

Windows 스토어 클라이언트 애플리케이션의 경우 보조 타일에 알림을 보내는 것은 기본 타일에 보내는 것과 같습니다. 기본 등록과 템플릿 등록이 모두 지원됩니다. 두 등록의 차이는 보조 타일의 경우 ChannelUri가 다르다는 것뿐입니다. 이 URI는 클라이언트 앱 핸들의 SDK에서 투명하게 처리됩니다.

높은 수준에서 이전 섹션에서 제공된 모든 정보는 사전 속성 Microsoft.WindowsAzure.Messaging.NotificationHub.SecondaryTiles에 노출된 개체에 해당하는 메서드를 호출하여 보조 타일에서 작동합니다. 예를 들어:

await hub.SecondaryTiles["myTileId"].RegisterNativeAsync(new string[] {"Yankees"});
await hub.SecondaryTiles["myTileId"].RegisterTemplateAsync(buildToastTemplate(), "toastTemplate", new string[] {"RedSox"});

SecondaryTiles 사전은 Windows Microsoft Store 앱에서 SecondaryTiles 개체를 만드는 데 사용되는 것과 동일한 TileId를 사용합니다.

기본 ChannelUri와 마찬가지로 보조 타일의 ChannelUris도 언제든지 변경할 수 있습니다. 알림 허브의 클라이언트 앱 등록이 지속적으로 업데이트되도록 하려면 장치에서 보조 타일의 최신 ChannelUri를 사용하여 해당 등록을 새로 고쳐야 합니다.

참고

앱이 비활성 상태일 때는 보조 타일을 삭제할 수 있습니다. 그러면 해당 등록이 알림을 보내지 않으며 알림 허브에 의해 자동으로 삭제됩니다.

장치에서 등록하는 경우의 단점

장치에서 등록하는 방식은 가장 간편하지만 몇 가지 단점이 있습니다.

첫 번째 단점은 클라이언트 앱이 활성 상태일 때에만 태그를 업데이트할 수 있다는 것입니다. 예를 들어 사용자의 두 장치에서 스포츠 팀 관련 태그를 등록하는 경우 첫 번째 장치에서 Seahawks 등의 추가 태그를 등록하면 두 번째 장치의 앱을 두 번째로 실행할 때까지 Seahawks에 대한 알림이 두 번째 장치에 수신되지 않습니다. 더 일반적으로 태그가 여러 디바이스의 영향을 받는 경우 백 엔드에서 태그 관리가 바람직한 옵션입니다.

클라이언트 앱에서 등록 관리의 두 번째 단점은 앱이 해킹을 당할 수 있으므로 “태그 수준 보안" 섹션에서 설명했듯이 특정 태그에 대한 등록을 보호하려면 좀 더 주의해야 합니다.

앱 백 엔드에서 등록 관리

백 엔드에서 등록을 관리하려면 추가 코드를 작성해야 합니다. 디바이스의 앱은 앱이 시작될 때마다(태그 및 템플릿과 함께) 백 엔드에 업데이트된 PNS 핸들을 제공해야 하며, 백 엔드는 Service Bus 이 핸들을 업데이트해야 합니다. 다음 그림은 이 디자인을 보여 줍니다.

Registration Management

백 엔드에서 등록을 관리하는 방식의 장점은 장치의 해당 앱이 비활성 상태일 때도 등록에 대한 태그를 수정할 수 있으며 태그를 등록에 추가하기 전에 클라이언트 앱을 인증할 수 있다는 것입니다.

앱 백 엔드에서 등록에 대해 기본 CRUDS 작업을 수행할 수 있습니다. 예를 들면 다음과 같습니다.

var hub = NotificationHubClient.CreateClientFromConnectionString("{connectionString}", "hubName");
            
// create a registration description object of the correct type, e.g.
var reg = new WindowsRegistrationDescription(channelUri, tags);

// Create
await hub.CreateRegistrationAsync(reg);

// Get by id
var r = await hub.GetRegistrationAsync<RegistrationDescription>("id");

// update
r.Tags.Add("myTag");

// update on hub
await hub.UpdateRegistrationAsync(r);

// delete
await hub.DeleteRegistrationAsync(r);

노드 또는 REST API를 사용할 수도 있습니다.

중요

백 엔드에서 등록 업데이트 간의 동시성을 처리해야 합니다. Service Bus는 등록 관리를 위해 낙관적 동시성 제어를 제공합니다. 이 기능은 HTTP 수준에서 등록 관리 작업에 대해 ETag를 사용하여 구현합니다. 이 기능은 동시성 문제로 인해 업데이트가 거부될 경우 예외를 throw하는 Microsoft SDK에 의해 투명하게 사용됩니다. 앱 백 엔드는 이러한 예외를 처리하고 필요한 경우 업데이트를 다시 시도하는 일을 담당합니다.

추가 리소스

다음 시나리오 자습서에서는 앱 백 엔드에서 등록하는 방법에 대한 단계별 지침을 제공합니다.