Share via


알림 채널을 요청, 만들기 및 저장하는 방법

앱이 푸시 알림을 받는 데 사용할 수 있는 채널 URI(Uniform Resource Identifier)를 열 수 있습니다. 그런 다음, 해당 채널을 서버에 보내서 서버가 푸시 알림을 보내는 데 사용하도록 할 수 있으며, 더 이상 필요하지 않은 경우 이를 닫을 수 있습니다. 채널은 특정 앱 또는 보조 타일에서 단일 디바이스의 단일 사용자를 나타내는 고유한 주소입니다.

앱이 시작될 때마다 새 채널을 요청하고 URI가 변경될 때 클라우드 서버를 업데이트해야 합니다. 자세한 내용은 설명을 참조하세요.

Important

알림 채널은 30일이 지나면 자동으로 만료됩니다.

알아야 하는 작업

기술

  • Windows 런타임

필수 조건

지침

1단계: 네임스페이스 선언 추가

Windows.UI.Notifications에는 알림 API가 포함됩니다.

using Windows.UI.Notifications;
using Windows.Data.Xml.Dom;
using Windows.Networking.PushNotifications;

2단계: 채널 URI 요청

이 예제에서는 채널 URI를 요청합니다. 이 요청은 알림 클라이언트 플랫폼에 전송되며, 이 플랫폼은 WNS의 채널 URI를 요청합니다. 요청이 완료되면 반환되는 값은 URI를 포함하는 PushNotificationChannel 개체입니다.

PushNotificationChannel channel = null;

try
{
    channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
}

catch (Exception ex)
{ 
    // Could not create a channel. 
}

3단계: 채널 URI를 서버에 보내기

채널 URI는 HTTP POST 요청에 패키징되고 서버로 전송됩니다.

Important

이 정보는 안전한 방식으로 서버에 전송해야 합니다. 채널 URI를 전송할 때 앱이 서버에 인증하도록 해야 합니다. 정보를 암호화하고 HTTPS와 같은 보안 프로토콜을 사용합니다.

String serverUrl = "http://www.contoso.com";

// Create the web request.
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(serverUrl);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] channelUriInBytes = System.Text.Encoding.UTF8.GetBytes("ChannelUri=" + channel.Uri);

// Write the channel URI to the request stream.
Stream requestStream = await webRequest.GetRequestStreamAsync();
requestStream.Write(channelUriInBytes, 0, channelUriInBytes.Length);

try
{
    // Get the response from the server.
    WebResponse response = await webRequest.GetResponseAsync();
    StreamReader requestReader = new StreamReader(response.GetResponseStream());
    String webResponse = requestReader.ReadToEnd();
}

catch (Exception ex)
{
    // Could not send channel URI to server.
}

설명

채널 요청

다음 논리를 사용하여 앱이 호출될 때마다 새 채널을 요청해야 합니다.

  1. 채널을 요청합니다.
  2. 새 채널과 이전 채널을 비교합니다. 채널이 동일한 경우 추가 작업을 수행할 필요가 없습니다. 이렇게 하려면 앱이 채널을 서비스에 성공적으로 보낼 때마다 채널을 로컬로 저장하여 나중에 채널을 비교할 수 있도록 해야 합니다.
  3. 채널이 변경된 경우 새 채널을 웹 서비스로 보냅니다. 다음과 같은 경우 항상 새 채널을 전송하는 오류 처리 논리를 포함합니다.
    • 앱이 이전에 웹 서비스로 채널을 전송한 적이 없습니다.
    • 앱의 웹 서비스로 채널을 전송하는 마지막 시도가 실패했습니다.

CreatePushNotificationChannelForApplicationAsync 메서드에 대한 서로 다른 호출이 항상 다른 채널을 반환하지는 않습니다. 채널이 마지막 호출 이후 변경되지 않은 경우 앱은 동일한 채널을 서비스에 다시 보내지 않는 방식으로 작업과 인터넷 트래픽을 절약해야 합니다. 앱에는 유효한 채널 URI가 동시에 여러 개 있을 수 있습니다. 각 고유 채널은 만료될 때까지 유효한 상태로 유지되기 때문에 이전 채널의 만료 시간에 영향을 주지 않으므로 새 채널을 요청하는 경우에는 나쁜 영향을 주지 않습니다.

앱이 호출될 때마다 새 채널을 요청하면 유효한 채널에 항상 액세스할 가능성을 극대화할 수 있습니다. 이는 타일 또는 알림 시나리오에서 콘텐츠가 항상 라이브 상태로 유지되는 것이 중요한 경우에 특히 중요합니다. 사용자가 30일마다 두 번 이상 앱을 실행하지 않을까봐 염려되는 경우 정기적으로 채널 요청 코드를 실행하는 백그라운드 작업을 구현할 수 있습니다.

채널 요청의 오류 처리

인터넷을 사용할 수 없는 경우 CreatePushNotificationChannelForApplicationAsync 메서드에 대한 호출이 실패할 수 있습니다. 이를 처리하려면 2단계에 표시된 코드에 재시도 논리를 추가합니다. 실패한 각 시도 사이에 10초의 지연 시간을 두고 세 번 시도하는 것이 좋습니다. 세 번의 시도가 모두 실패하면 앱은 다음 번에 사용자가 다시 시도하기 위해 이를 시작할 때까지 대기해야 합니다.

채널 닫기

앱은 PushNotificationChannel.Close 메서드를 호출하여 모든 채널에서 알림 전달을 즉시 중지할 수 있습니다. 앱에서 이러한 작업을 수행하는 것이 일반적이지는 않지만 앱에 대한 모든 알림 전달을 중지하려는 특정 시나리오가 있을 수 있습니다. 예를 들어 앱에 사용자 계정의 개념이 있고 사용자가 해당 앱에서 로그아웃하는 경우 타일이 더 이상 해당 사용자의 개인 정보를 표시하지 않는다고 예상하는 것이 합리적입니다. 콘텐츠 타일을 지우고 알림 전달을 중지하려면 다음을 수행해야 합니다.

  1. 타일, 알림, 배지 또는 원시 알림을 사용자에게 전달하는 알림 채널에서 PushNotificationChannel.Close 메서드를 호출하여 모든 타일 업데이트를 중지합니다. Close 메서드를 호출하면 해당 사용자에 대한 추가 알림이 클라이언트에 전달될 수 없습니다.
  2. TileUpdater.Clear 메서드를 호출하는 방식으로 타일에서 이전 사용자의 데이터를 제거하여 타일의 내용을 지웁니다.