Visual Studio のウィザードを使用すると、Azure Mobile Services で作成されたモバイル サービスからプッシュ通知を生成できます。 Visual Studio ウィザードでは、作業の開始に役立つコードが生成されます。 このトピックでは、ウィザードでプロジェクトがどのように変更されるか、生成されたコードの動作、このコードの使用方法、プッシュ通知を最大限に活用するために次に実行できることについて説明します。 Windows プッシュ通知サービス (WNS) の概要を参照してください。
ウィザードでプロジェクトを変更する方法
プッシュ通知ウィザードは、次の方法でプロジェクトを変更します。
- Mobile Services Managed Client (MobileServicesManagedClient.dll) への参照を追加します。 JavaScript プロジェクトには適用されません。
- サービスの下のサブフォルダーにファイルを追加し、ファイルにpush.register.cs、push.register.vb、push.register.cpp、または push.register.jsという名前を付けます。
- モバイル サービスのデータベース サーバーにチャネル テーブルを作成します。 このテーブルには、アプリ インスタンスにプッシュ通知を送信するために必要な情報が含まれています。
- 削除、挿入、読み取り、更新の 4 つの関数のスクリプトを作成します。
- すべてのクライアントにプッシュ通知を送信するカスタム API notifyallusers.jsを使用してスクリプトを作成します。
- App.xaml.cs、App.xaml.vb、またはApp.xaml.cpp ファイルに宣言を追加するか、JavaScript プロジェクトの新しいファイル (service.js) に宣言を追加します。 この宣言は MobileServiceClient オブジェクトを宣言します。このオブジェクトには、モバイル サービスへの接続に必要な情報が含まれています。 この MobileServiceClient オブジェクトは、MyServiceNameClient という名前が付けられています。このオブジェクトには、AppMyServiceNameClient という名前を使用して、アプリ内の任意のページからアクセスできます。
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 メソッドはプッシュ通知を受信するようにデバイスを登録します。 ストアは、アプリのインストール済みインスタンスを追跡し、プッシュ通知チャネルを提供します。 See 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
});
}
});
})();
プッシュ通知タグは、クライアントのサブセットに通知を制限する方法を提供します。 for registerNative メソッド (または RegisterNativeAsync) メソッドを使用して、タグを指定せずにすべてのプッシュ通知に登録するか、タグの配列である 2 番目の引数を指定してタグに登録することができます。 1 つ以上のタグで登録すると、それらのタグに一致する通知のみが受信されます。
サーバー側スクリプト (JavaScript バックエンドのみ)
JavaScript バックエンドを使用するモバイル サービスの場合、サーバー側スクリプトは、削除、挿入、読み取り、または更新の操作が発生したときに実行されます。 スクリプトはこれらの操作を実装しませんが、クライアントから Windows Mobile REST API への呼び出しによってこれらのイベントがトリガーされたときに実行されます。 その後、スクリプトは、request.execute または request.respond を呼び出して呼び出し元のコンテキストに応答を発行することで、操作自体に制御を渡します。 Azure Mobile Services 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 関数は、トースト通知として 1 つの通知を送信します。 他の種類のプッシュ通知を使用することもできます。
ヒント スクリプトの編集中にヘルプを表示する方法については、「サーバー側 JavaScriptの IntelliSense を有効にする」を参照してください。
プッシュ通知の種類
Windows では、プッシュ通知ではない通知がサポートされています。 通知に関する一般的な情報については、「通知配信方法の選択を参照してください。
トースト通知は使いやすく、ユーザーのために生成されたチャネルのテーブルにある Insert.js コードの例を確認できます。 タイル通知またはバッジ通知を使用する場合は、タイルとバッジの XML テンプレートを作成する必要があります。また、テンプレートにパッケージ化された情報のエンコードを指定する必要があります。 「タイル、バッジ、トースト通知の操作」を参照してください。
Windows はプッシュ通知に応答するため、アプリが実行されていないとき、これらの通知のほとんどを処理できます。 たとえば、プッシュ通知を使用すると、ローカル メール アプリが実行されていない場合でも、新しいメール メッセージがいつ使用できるかをユーザーに通知できます。 Windows は、テキスト メッセージの最初の行などのメッセージを表示することで、トースト通知を処理します。 Windows は、新しいメール メッセージの数を反映するようにアプリのライブ タイルを更新することで、タイルまたはバッジ通知を処理します。 この方法では、アプリのユーザーに新しい情報を確認するように求めることができます。 アプリは実行中に生の通知を受け取ることができ、それらを使用してアプリにデータを送信できます。 アプリが実行されていない場合は、プッシュ通知を監視するバックグラウンド タスクを設定できます。
Windows アプリのガイドラインに従ってプッシュ通知を使用する必要があります。これらの通知はユーザーのリソースを使い切り、過度に使用すると気が散る可能性があるためです。 プッシュ通知については、
プッシュ通知を使用してライブ タイルを更新する場合は、「ガイドライン」のガイドラインと、タイルとバッジのチェックリストにも従う必要があります。
Next steps
Windows プッシュ通知サービス (WNS) の使用
Mobile Services に十分な柔軟性がない場合、C# または Visual Basic でサーバー コードを記述する場合、または既にクラウド サービスがあり、そこからプッシュ通知を送信する場合は、Windows プッシュ通知サービス (WNS) を直接呼び出すことができます。 WNS を直接呼び出すことで、データベースまたは別の Web サービスからのデータを監視する worker ロールなど、独自のクラウド サービスからプッシュ通知を送信できます。 クラウド サービスは、アプリにプッシュ通知を送信するために WNS で認証する必要があります。 「Windows プッシュ通知サービス (JavaScript) または (C#/C++/VB)で認証する方法を参照してください。
モバイル サービスでスケジュールされたタスクを実行して、プッシュ通知を送信することもできます。 「Mobile Servicesで定期的なジョブをスケジュールする」を参照してください。
警告 プッシュ通知ウィザードを 1 回実行した後は、もう一度ウィザードを実行して別のモバイル サービスの登録コードを追加しないでください。 プロジェクトごとにウィザードを複数回実行すると、CreatePushNotificationChannelForApplicationAsync メソッドの呼び出しが重複するコードが生成され、ランタイム例外が発生します。 複数のモバイル サービスのプッシュ通知に登録する場合は、ウィザードを 1 回実行し、登録コードを書き直して、CreatePushNotificationChannelForApplicationAsync の呼び出しが同時に実行されないようにします。 たとえば、ウィザードで生成されたコードを push.register.* (CreatePushNotificationChannelForApplicationAsync
Related topics
- Windows プッシュ通知サービス (WNS) の概要
- 未加工通知の概要
- Windows Azure Mobile Services (JavaScript) への接続
- Windows Azure Mobile Services への接続 (C#/C++/VB)
- クイック スタート: モバイル サービス (JavaScript) のプッシュ通知を追加する
Windows developer