다음을 통해 공유


푸시 알림 마법사에서 생성된 코드

Visual Studio의 마법사를 사용하여 Azure Mobile Services와 함께 만든 모바일 서비스에서 푸시 알림을 생성할 수 있습니다. Visual Studio 마법사는 시작하는 데 유용한 코드를 생성합니다. 이 항목에서는 마법사에서 프로젝트를 수정하는 방법, 생성된 코드가 수행하는 작업, 이 코드를 사용하는 방법 및 푸시 알림을 최대한 활용하기 위해 다음에 수행할 수 있는 작업에 대해 설명합니다. WNS(Windows 푸시 알림 서비스) 개요를 참조하세요.

마법사에서 프로젝트를 수정하는 방법

푸시 알림 마법사는 다음과 같은 방법으로 프로젝트를 수정합니다.

  • Mobile Services Managed Client(MobileServicesManagedClient.dll)에 대한 참조를 추가합니다. JavaScript 프로젝트에는 적용되지 않습니다.
  • 서비스 아래의 하위 폴더에 파일을 추가하고 파일 이름을 push.register.cs, push.register.vb, push.register.cpp 또는 push.register.js로 지정합니다.
  • 모바일 서비스에 대한 데이터베이스 서버에 채널 테이블을 만듭니다. 이 테이블에는 앱 인스턴스에 푸시 알림을 보내는 데 필요한 정보가 포함되어 있습니다.
  • 삭제, 삽입, 읽기 및 업데이트의 네 가지 함수에 대한 스크립트를 만듭니다.
  • 모든 클라이언트에 푸시 알림을 보내는 사용자 지정 API notifyallusers.js 사용하여 스크립트를 만듭니다.
  • App.xaml.cs, App.xaml.vb 또는 App.xaml.cpp 파일에 선언을 추가하거나 JavaScript 프로젝트의 새 파일 service.js 선언을 추가합니다. 이 선언은 모바일 서비스에 연결하는 데 필요한 정보를 포함하는 MobileServiceClient 개체를 선언합니다. 앱의 모든 페이지에서 MyServiceNameClient라는 이름의 이 MobileServiceClient 개체에 액세스할 수 있습니다(App.MyServiceNameClient라는 이름 사용).

services.js 파일에는 다음 코드가 포함되어 있습니다.

var <mobile-service-name>Client = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient(
                "https://<mobile-service-name>.azure-mobile.net/",
                "<your client secret>");

푸시 알림을 위한 등록

push.register.*에서 UploadChannel 메서드는 푸시 알림을 수신할 디바이스를 등록합니다. 스토어는 앱의 설치된 인스턴스를 추적하고 푸시 알림 채널을 제공합니다. PushNotificationChannelManager를 참조하세요.

클라이언트 코드는 JavaScript 백엔드와 .NET 백엔드 모두에 대해 유사합니다. 기본적으로 JavaScript 백엔드 서비스에 대한 푸시 알림을 추가하면 NotifyAllUsers 사용자 지정 API에 대한 샘플 호출이 UploadChannel 메서드에 삽입됩니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MobileServices;
using Newtonsoft.Json.Linq;

namespace App2
{
    internal class mymobileservice1234Push
    {
        public async static void UploadChannel()
        {
            var channel = await Windows.Networking.PushNotifications.PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

            try
            {
                await App.mymobileservice1234Client.GetPush().RegisterNativeAsync(channel.Uri);
                await App.mymobileservice1234Client.InvokeApiAsync("notifyAllUsers");
            }
            catch (Exception exception)
            {
                HandleRegisterException(exception);
            }
        }

        private static void HandleRegisterException(Exception exception)
        {
            
        }
    }
}
Imports Microsoft.WindowsAzure.MobileServices
Imports Newtonsoft.Json.Linq

Friend Class mymobileservice1234Push
    Public Shared Async Sub UploadChannel()
        Dim channel = Await Windows.Networking.PushNotifications.PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync()

        Try
            Await App.mymobileservice1234Client.GetPush().RegisterNativeAsync(channel.Uri)
            Await App.mymobileservice1234Client.GetPush().RegisterNativeAsync(channel.Uri, New String() {"tag1", "tag2"})
            Await App.mymobileservice1234Client.InvokeApiAsync("notifyAllUsers")
        Catch exception As Exception
            HandleRegisterException(exception)
        End Try
    End Sub

    Private Shared Sub HandleRegisterException(exception As Exception)

    End Sub
End Class
#include "pch.h"
#include "services\mobile services\mymobileservice1234\mymobileservice1234Push.h"

using namespace AzureMobileHelper;

using namespace web;
using namespace concurrency;

using namespace Windows::Networking::PushNotifications;

void mymobileservice1234Push::UploadChannel()
{
    create_task(PushNotificationChannelManager::CreatePushNotificationChannelForApplicationAsync()).
    then([] (PushNotificationChannel^ newChannel) 
    {
        return mymobileservice1234MobileService::GetClient().get_push().register_native(newChannel->Uri->Data());
    }).then([]()
    {
        return mymobileservice1234MobileService::GetClient().invoke_api(L"notifyAllUsers");
    }).then([](task<json::value> result)
    {
        try
        {
            result.wait();
        }
        catch(...)
        {
            HandleExceptionsComingFromTheServer();
        }
    });
}

void mymobileservice1234Push::HandleExceptionsComingFromTheServer()
{
}
(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;

    app.addEventListener("activated", function (args) {
        if (args.detail.kind == activation.ActivationKind.launch) {
            Windows.Networking.PushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync()
                .then(function (channel) {
                    mymobileserviceclient1234Client.push.registerNative(channel.Uri, new Array("tag1", "tag2"))
                    return mymobileservice1234Client.push.registerNative(channel.uri);
                })
                .done(function (registration) {
                    return mymobileservice1234Client.invokeApi("notifyAllUsers");
                }, function (error) {
                    // Error

                });
        }
    });
})();

푸시 알림 태그는 알림을 클라이언트 하위 집합으로 제한하는 방법을 제공합니다. registerNative 메서드(또는 RegisterNativeAsync) 메서드를 사용하여 태그를 지정하지 않고 모든 푸시 알림을 등록하거나 태그열인 두 번째 인수를 제공하여 태그를 등록할 수 있습니다. 하나 이상의 태그를 등록하는 경우 해당 태그와 일치하는 알림만 수신합니다.

서버 쪽 스크립트(JavaScript 백엔드에만 해당)

JavaScript 백엔드를 사용하는 모바일 서비스의 경우 삭제, 삽입, 읽기 또는 업데이트 작업이 발생할 때 서버 쪽 스크립트가 실행됩니다. 스크립트는 이러한 작업을 구현하지 않지만 클라이언트에서 Windows Mobile REST API로의 호출이 이러한 이벤트를 트리거할 때 실행됩니다. 그런 다음 스크립트는 request.execute 또는 request.respond를 호출하여 작업 자체에 제어를 전달하여 호출 컨텍스트에 대한 응답을 실행합니다. Azure 모바일 서비스 REST API 참조를 참조하세요.

서버 쪽 스크립트에서는 다양한 함수를 사용할 수 있습니다. Azure Mobile Services에서 테이블 등록 작업을 참조하세요. 사용 가능한 모든 함수에 대한 참조는 Mobile Services 서버 스크립트 참조를 참조하세요.

Notifyallusers.js에서 다음 사용자 지정 API 코드도 만들어집니다.

exports.post = function(request, response) {
    response.send(statusCodes.OK,{ message : 'Hello World!' })
    
    // The following call is for illustration purpose only
    // The call and function body should be moved to a script in your app
    // where you want to send a notification
    sendNotifications(request);
};

// The following code should be moved to appropriate script in your app where notification is sent
function sendNotifications(request) {
    var payload = '<?xml version="1.0" encoding="utf-8"?><toast><visual><binding template="ToastText01">' +
        '<text id="1">Sample Toast</text></binding></visual></toast>';
    var push = request.service.push; 
    push.wns.send(null,
        payload,
        'wns/toast', {
            success: function (pushResponse) {
                console.log("Sent push:", pushResponse);
            }
        });
}

sendNotifications 함수는 단일 알림을 알림 메시지로 보냅니다. 다른 유형의 푸시 알림을 사용할 수도 있습니다.

스크립트를 편집하는 동안 도움말을 보는 방법에 대한 자세한 내용은 서버 쪽 JavaScript에 IntelliSense 사용 설정을 참조하세요.

 

푸시 알림 유형

Windows는 푸시 알림이 아닌 알림을 지원합니다. 알림에 대한 일반적인 내용은 알림 전달 방법 선택을 참조하세요.

알림 메시지는 사용하기 쉽고, 생성된 채널 테이블의 Insert.js 코드 예제를 검토할 수 있습니다. 타일 또는 배지 알림을 사용하려는 경우 타일 및 배지에 대한 XML 템플릿을 만들어야 하며 템플릿에서 패키지된 정보의 인코딩을 지정해야 합니다. 타일, 배지 및 알림 메시지 작업을 참조하세요.

Windows는 푸시 알림에 응답하기 때문에 앱이 실행되고 있지 않을 때 대부분의 알림을 처리할 수 있습니다. 예를 들어 푸시 알림은 로컬 메일 앱이 실행되고 있지 않은 경우에도 새 메일 메시지를 사용할 수 있는 시기를 사용자에게 알릴 수 있습니다. Windows는 문자 메시지의 첫 줄과 같은 메시지를 표시하여 알림 메시지를 처리합니다. Windows는 새 메일 메시지 수를 반영하도록 앱의 라이브 타일을 업데이트하여 타일 또는 배지 알림을 처리합니다. 이러한 방식으로 앱 사용자에게 새 정보를 확인하라는 메시지를 표시할 수 있습니다. 앱이 실행 중일 때 원시 알림을 받을 수 있으며 이를 사용하여 데이터를 앱에 보낼 수 있습니다. 앱이 실행되고 있지 않으면 푸시 알림을 모니터링하도록 백그라운드 작업을 설정할 수 있습니다.

이러한 알림은 사용자 리소스를 사용하며, 과도하게 사용할 경우 방해가 될 수 있으므로 Windows 앱에 대한 참고 자료에 따라 푸시 알림을 사용해야 합니다. 푸시 알림에 대한 지침 및 체크리스트를 참조하세요.

푸시 알림으로 라이브 타일을 업데이트하는 경우 타일 및 배지에 대한 지침 및 체크리스트의 지침을 따라야 합니다.

다음 단계

Windows 푸시 알림 서비스(WNS) 사용

Mobile Services에서 충분한 유연성을 제공하지 않거나, C# 또는 Visual Basic에서 서버 코드를 작성하거나, 클라우드 서비스가 이미 있고 푸시 알림을 보내려는 경우 Windows WNS(푸시 알림 서비스)를 직접 호출할 수 있습니다. WNS를 직접 호출하면 데이터베이스 또는 다른 웹 서비스의 데이터를 모니터링하는 작업자 역할과 같은 사용자 고유의 클라우드 서비스에서 푸시 알림을 보낼 수 있습니다. 클라우드 서비스는 앱에 푸시 알림을 보내려면 WNS를 사용하여 인증해야 합니다. Windows 푸시 알림 서비스(JavaScript) 또는 (C#/C++/VB)로 인증하는 방법을 참조하세요.

모바일 서비스에서 예약된 작업을 실행하여 푸시 알림을 보낼 수도 있습니다. Mobile Services에서 되풀이 작업 예약을 참조하세요.

경고 푸시 알림 마법사를 한 번 실행한 후에는 마법사를 두 번 실행하여 다른 모바일 서비스에 대한 등록 코드를 추가하지 마세요. 프로젝트당 마법사를 두 번 이상 실행하면 CreatePushNotificationChannelForApplicationAsync 메서드에 대한 호출이 겹쳐서 런타임 예외가 발생하는 코드가 생성됩니다. 둘 이상의 모바일 서비스에 대한 푸시 알림을 등록하려면 마법사를 한 번 실행한 다음 등록 코드를 다시 작성하여 CreatePushNotificationChannelForApplicationAsync에 대한 호출이 동시에 실행되지 않도록 합니다. 예를 들어 CreatePushNotificationChannelForApplicationAsync에 대한 호출을 포함하여 push.register.*의 마법사 생성 코드를 OnLaunched 이벤트 외부로 이동하면 이 작업을 완료할 수 있지만 이 작업의 특징은 앱의 아키텍처에 따라 다릅니다.