Windows 8 と Windows Phone アプリに Windows Azure を使って Push Notifications を送ってみる ~ クラウドカバー Episode 79

 

今回のクラウドカバー「Episode 79 - Adding Push Notifications to Windows 8 and Windows Phone apps using Windows Azure」は、「Nick Harris が語る Windows 8 のための Push Notifications ~ クラウドカバー Episode 73」にも出ていた Nick と Nathan で、Push Notification のお話し再び。

 

前回(Episode 73)では、大まかな概念とコードの概要を説明しましたが、今回はそのときに紹介した Toolkit が NuGet 対応したという事で、もう少し詳しくコードの説明を行いながら、また合わせて Windows Phone への Notification も取り扱います。

 

 

いつものように、ニュースから。

 

Announcing Native Windows Azure Libraries and Special Free Pricing using Twilio for Windows Azure Customers

テキストメッセージングのサービスを行っている Twilo (つぅいろー)社から、Windows Azure ユーザーに一定量の無償利用枠が設定されたことのお知らせ。

Twilo のサービスを利用すると、クライアント(携帯)に対してテキストメッセージを送ったり、Voice 機能を使ったアプリケーション作成を行えるという事です。Twilo を使うためのライブラリーとして、.NET、Java、PHP のライブラリも用意されていますので、Windows Azure のアプリケーションに Twilo の機能を組み込むことも容易にできそうです。

 

Announcing Casablanca, a Native Library to Access the Cloud From C++

クラウドサービスを、C++ から利用するためのネイティブライブラリー Casablanca の紹介です。

Casablanca は(正式なプロダクトという位置づけではなく)インキュベーションプロジェクトとして実施されているプロジェクトで、Windows Azure の Blob および Queue にアクセスするためのライブラリーや、REST サービスを利用するための機能を持っています。

 

また Asynchronous C++ API な設計、ということで、非同期処理の特長も取り入れているモダンな作りになっているようです。

 

 

Automatic Migration of Access Control Service Version 1.0

Windows Azure の Access Control は、現在 version 2.0 としてサービスを公開していますが、現時点でまだ version 1.0 を使い続けているお客様に対して、自動マイグレーションが行われる旨のお知らせです。

 

すでに ACS 1.0 を利用している開発者の方には、e-mail での通知を行っているようですが、もしまだ通知を受け取っていない、という ACS 1.0 利用者(開発者)の方がいらっしゃいましたら、Windows Azure の Subscription ID と利用中の ACS 1.0 の名前空間を添えて、acsmigration@microsoft.com にメールをお願いいたします。

 

 

ということで、ここからはスペシャルゲスト(!?)の Nick に Push Notification について語ってもらいます。

image

 

 

さて、「Windows Azure Toolkit for Windows 8」は引き続き CodePlex からも入手可能ですが、今回は NuGet なシナリオ、ということで Visual Studio からデモは開始されます。

 

なお、今回 Nick が使用しているのは、Visual Studio 11 の Beta 版です。

Blank な C# アプリケーションのテンプレートを選択し、プロジェクトの作成を行います。

image

 

まず、このアプリケーションで実施することは、(1) Windows Notification サービスにアクセスして、Notification 用のチャネルを受け取る、(2) 受け取ったチャネルを通知を発生させるクラウドサービスに登録する、ということです(このあたりの Puch Notification の仕組みや動きの概要は、Episode 73 を参照ください)。

 

今回のアプリケーションでは、ボタンを押すと(1)の Request と、(2) のRegister を同時に行うアプリケーションを作成します。

スニペット&Visual Studio のコード支援機能でさわやかにコーディングを進める Nick。

(下記の画面は、Visual Studio の支援機能で、不足するアセンブリ参照を予測し、お勧めしてくれているところ)

image

 

なお、今回(2) でチャネルを登録するクラウドサービスは、ローカルホストにしてコーディングを進めています。また、今回 Nick が説明しているコードは、基本的には NuGet で入手できるアセンブリのコードの中身であり、通常の開発ではこの部分は書く必要はありません。

具体的には、以下のような感じで NuGet(にゅーげっと)してください。

 

    PM> Install-Package Windows8.Notifications

 

引き続き、コードの解説がつづきます。

 

image

 

今回 (2) の登録においては、Json 形式の Payload をサーバーに対して渡していますが、この部分はサーバー実装次第になります(今回は Json で実施)。

 

なお、CreatePayload() メソッド中で利用しているフォーマット(K_PAYLOAD)は以下の通り。

image

 

 

最後に、受け取ったチャネル情報を、画面に出すように設定したら、クライアントサイドの開発は終了です。

 

引き続き、サーバーサイド(Windows Azure アプリ)の開発を行うために Visual Studio 2010 を立ち上げます。

Nathan がコメントしているように、サーバーサイドの開発で Visual Studio 2010 を使用するのは、Windows Azure の SDK が Visual Studio 11 にまだ対応できていないためで、将来的に Visual Studio 11 でサーバーサイド(Windows Azure アプリ)の開発ができるようになる予定です。

 

サーバーサイドは、MVC4 の Web Role で、インターネットアプリのテンプレートを利用してプロジェクトを作成します。

そして、今回は NuGet を使って Notification 機能をインストール。

 

   PM> Install-Package WindowsAzure.Notifications

 

このサーバーサイドのパッケージは、Windows 8 だけでなく、Windows Phone の Push Notification にも対応できるように作られています。

 

パッケージのインストールが終わると、Web API なコントローラーとして(ApiController を継承したクラスとして)EndpointController が追加されます。

image

 

このコントローラーが、クライアント(Windows 8 もしくは Windows Phone) から受け取ったチャネル情報を Windows Azure Storage に保存します。

 

 

次に、登録されているチャネル情報に基づき、実際の通知を行うための機能として、View に Notification を開始するためのコードを追加します。

image

 

以下がそのリクエストに対して呼び出されるコントローラーのロジック。

image

 

 

さて、Notification を行う場合、通常はデータを XML でシリアライズし、Windows Notification Service に渡す必要があります。この部分は MSDN でもドキュメントが用意されているのですが、Nick のほうで WNSレシピとしてロジックを用意している、ということなので、ここで再び NuGet。

 

PM> Install-Package WnsRecipe

 

さて、Notification を行うために、一番最初に行うのは、このクラウドサービスから Windows Notification Service にアクセスするための認証です。

image

 

この認証においては、あらかじめ Windows Notification の開発者用申請ページで、必要な情報を取得しておきます。

Windows Notification Service を利用する際には、サーバーサイドからクライアント シークレットと SID(Security Identifier) の2つの情報が、クライアントサイドからはパッケージ名の情報が、必要になります。

これら3つの情報がそろって、Windows Notification Service が利用できます。

 

また、サーバーサイドで必要となるクライアント シークレット、SID の情報は、クライアントアプリに含めたりせずに秘密情報としてしっかり保管してください。

 

以下が、実際に生成された3つの情報で、それぞれをサーバーサイド(Windows Azure アプリ)、クライアントサイド(Windows 8 アプリ)に含めていきます。

image

 

サーバーサイドでは、Windows Notification Service での認証を終えると、Windows Azure ストレージに記録されているチャネル情報を取り出し、順番に Notification を行っていきます。

 

ここで Nick はトーストおよび、タイル通知の説明を行っています。

Windows 8 では、横長のタイルと正方形のタイルを選択可能なアプリケーションを作成できる、ということで、タイル通知を行う場合は、横長タイル(Wide)と正方形のタイル(Square)の両方の Notification を送る必要があります(ユーザーがどちらのタイルにしているかサーバーからは判別できないので。あるいはタイルのサイズを固定しておく、という方法もあるようです)

image

 

 

さて、最後の仕上げに、クライアント(Windows 8 アプリ)で、タイルとトースト通知の設定を行ったら、いよいよアプリを動かしてみましょう。

 

っと、アプリを動かす前に、ストレージに Notification のチャネルが登録されていないことを確認。

 

image

 

 

まだ登録情報は一件もありません。この状態で、まずは、サーバーのデバッグ実行を開始。

ためしに、先ほど作成した Endpoint コントローラーを直接たたくと、空っぽのデータ(endpoint.json) が帰ってきます。

image

 

 

さて、お次はクライアントサイドのアプリを立ち上げ、「Request and Register」のボタンを押します。

image

 

すると、Windows Notification Service(WNS)にチャネルのリクエストを行い、受け取ったチャネルをクラウドサービスに登録しに行きます。

 

ここまで、デバッグ実行なしでクライアント、サーバー両方の開発を行ってきましたが、Nick は「おれ、ジニアスだから大丈夫!」とのお言葉。そして、その言葉通りしっかりアプリが動いたようです!

Windows Azure ストレージにもチャネル情報がしっかり登録されています。

image

 

 

お次は、サーバーから、通知を行ってみましょう。

サーバーの通知ボタンを押すと、クライアント(Nick の Windows 8 PC)に通知のトーストが表示されました!

image

 

タイルへの通知も行われており、サイズを変えても通知を確認できます。

image

 

 

さて、お次は Windows Phone アプリで通知を受け取ってみましょう。

利用するのは、通常の Windows Phone アプリのテンプレート。プロジェクトができたら、早速 NuGet。

PM> Install-Package Phone.Notification.BasePage

 

すると、Notification を行うためのページが作成されます。

image

 

Windows Phone アプリでは  Push Notification を行うアプリケーションを Marketplace に登録する場合、ユーザーのオプトインでの同意が必要です(明示的にユーザーが「Notification を利用する」ということを表明する必要があります)。この BasePage はその役割を果たすためのページになります。

 

また、Windows 8 と Windows Phone で利用する Notification Service は厳密には異なるサービスになります。

そこで、サーバーサイドのコントローラーでは、チャネルの URL を使って、Windows 8 と Windows Phone で送る Notification の情報を切り分けるコードを追加します。

以下のコードでは、Windows 8 用の Notification チャネルでは URL に “notify.windows” という文字が含まれることを利用して、この切り分けを行っています。

image

 

また、Windows 8 の時と同様に、Notification を送るためのロジックをライブラリ化した通知用のレシピを追加します。

PM> Install-Package Mpns.Recipe

 

以下が、MPNS レシピを利用した、Windows Phone に対するトーストメッセージの通知ロジック。

image

 

 

ここで、Windows Phone のクライアントアプリを立ち上げ、Notification に同意すると、チャネルのリクエストと登録が行われます。今回も一度のトライで、無事、登録が行われました。ちなみに、Windows Phone 用のチャネルでは、URL が “notify.live.net” になっています。

image

 

 

サーバーから Notification を行うと、無事に Windows 8 (右上の囲み)と、Windows Phone (左上の囲み)両方にトースト通知が表示されました。

image

 

また、Notification の結果については NotificationSendResult インスタンスによって戻されるので、たとえばユーザーがオフラインで通知が届かなかった場合に再送を行いたい、といった要件があれば Worker Role や、Service Bus の Queue を使うなどして、再通知を試みる、といったロジックを書くことも可能です。

 

 

最後は恒例の Tip of the Week!

image

 

今回の Tip は「Top 7 Concerns of Migrating an ASP.NET Application to Windows Azure」から、ASP.NET アプリケーションを Windows Azure に移行する際の7つの対応ポイント。

 

1. Handling Storage

2. Mapping ASP.NET Applications to Windows Azure Roles

3. Application Dependencies

4. Session State

5. Identity & Authentication In The Cloud

6. Handling Configuration

7. IIS Configuration Differences

 

という事で、今回のクラウドカバー Episode 78、Windows 8 と Windows Phone アプリに Windows Azure を使って Push Notification を送ってみる、の紹介は終了です。

 

それでは!