よくわかるMPNS
Windows Phone Arch NAGOYA
yutaka Tsumori
自己紹介
• tmytです
• 大学院生は世を忍ぶ仮の姿
 • 昨日修士論文を提出しました
 • 4月から社会人になってしまいます…
• 白紙マスターです
• Microsoft MVP for Device Application Development
  (Jan.2011-Dec.2012) だったりします
おしながき
• スマートフォンを取り巻く環境
• PushとPull
• MPNSのおはなし
• 実装例
スマートフォンを取り巻く環境
• 携帯端末で扱う情報の変化
•   静的Web
•   メール
•   動的Web
•   リアルタイムWeb
むかしのおはなし
• 遙か昔Air H”とかでPDAで必死通信してた頃
• Webブラウザで普通のWebページを見ていました
• 帯域も細いので画像も圧縮したりしてました
• 端末も今ほど速くはないので派手なことはできませんでした
• 電池も多くはないので今ほど派手な通信とかもできませんでした
時代が解決したこと
• 通信回線の高速化
• 64Kbps → 7.2Mbps
• 演算速度の向上
• SH-3 40MHz → MSM8655 1GHz
• バッテリの変化
• 乾電池2本(20時間) → Li-ion 1460mAh(280時間)
最近のトレンド
• 大容量のリッチコンテンツ
• 動画
• ゲーム
• リアルタイムな情報のやりとり
• SMS/MMS
• RSS
• ソーシャル
リアルタイムな変化を受け取る
• 例えば
•   GPSで目的の位置にたどり着いたときに
•   SMSで特定のメールが届いた時に
•   ネットワークの状態が変化した時に
•   端末がスリープから起き上がった時に
•   SNSで自分宛のメッセージが送信された時に
PushとPull
• 外の世界との通信には大きく分けて2種類
• Push
• Pull
• それぞれに違った特性があります
Pull
• ユーザ(端末)が能動的に情報を取得する
• 例えば
 • ブラウザでWebページを開く
 • メールボックスの中身をダウンロードする
 • Marketplaceからアプリをインストールする
• 情報を引っ張ってくる(Pull)イメージ
• 任意のタイミングで通信を開始できるのでバッテリなどを意識で
  きる
Push
• ユーザ(端末)が受動的に情報を取得する
• 例えば
 • 電話の着信
 • メールが届いた
 • インスタントメッセージング
• 情報が網側から飛んでくる(Push)イメージ
• リアルタイムに情報を扱うことができる反面バッテリの消費量が
  増加する
Pushの実装方法
• いくつかの方法
• 網でサポートされたPush配信
 • 例えば
  • SMS通知
 • 本当の意味でPush配信
• TCP/IPで通知チャネルを使用したPush配信
 • 例えば
  • インスタントメッセージング
 • ネットワークを介した擬似的なPush配信
OSに見るPush通知フレームワーク
• Windows Phone
 • Microsoft Push Notification Service (MPNS)
• iPhone
 • Apple Push Notification Service (APNS)
• Android
 • Cloud to Device Messaging (C2DM)
• Windows Mobile (おまけ)
 • 自力
フレームワークの挙動
• OSごとに細かな違いはあるがだいたい同じ
• OSへPush通知の利用を登録
 • OSは各社のサービスへレジスト
 • その後通知トークンが取得できる
• 任意のタイミングで通知トークンを使用しサービスサーバはメッセー
  ジを送信
• サービスサーバはデバイスへメッセージを転送
• メッセージを受け取ったデバイスは適宜処理を行う
フレームワークの挙動の図

   プッシュチャネルを要
   求

                                                        チャネルURIをサー
                                                    3
 チャネルを応答        2       1                               ビスへ通知



                    5            チャネルURIを経由し
                             4
                                 MPNSへ通知を送信


                            デバイスへメッセージ
 MPNSサーバ                    を送信                           Webサービス

      出展: ftp://ftp.charlespetzold.com/TechEd2011/09-Networking.pptx
MPNSを使ってみる
• MPNSを使用するのに必要なもの
• MPNSを利用するアプリケーション
• デバイスにメッセージを送信するサーバ
• 少しのコーディングで簡単に利用できます
MPNSクライアント
• 必要なもの
• Microsoft.Phone.Notification
   • HttpNotificationChannel
• このクラスだけでPush通知を利用できる
簡単な使い方
• HttpNotificationChannelをインスタンス化
• ChannelUriUpdatedイベントハンドラを追加
• Open() でセッションをスタート
• BindToShellToast() でトースト通知をOSに登録
• ChannelUriUpdatedイベントが発生したら通知先URLをサーバへ
  転送

• ね?簡単でしょ?
サーバで行うこと
• クライアントから通知先URLを受け取る
• サーバで処理中任意のタイミングで通知先URLへXMLを送信する
• → デバイスへメッセージが送信される
利用出来る通知の種類
• Windows Phoneでは3種類
 • トースト通知
 • タイル通知
 • Raw通知
• 最初の2個はアプリケーションが実行されていない場合でも受信
  できる
• 今回はトースト通知をサンプルにします
トースト通知
• トーストというのは端末上部に表示される短いメッセージ
• Windows Phoneにおいて他のアプリケーション実行中でもユーザ
  にメッセージを表示できる唯一の方法
トースト通知を送信する
• 手順
• トーストの内容を含んだXMLを通知先URLへ送信
• 以上
• 簡単です

• ほんとうに?
MPNSで必要なリクエストヘッダ
• MPNSではHTTPリクエストにいくつかの追加ヘッダが必要
 •   X-MessageID
 •   X-NotificationClass
 •   X-WindowsPhone-Target
 •   X-CallbackURI
• 最低限NotificationClass, WindowsPhone-Targetは必要
トーストの送信に必要なヘッダ
• 先ほどのリクエストヘッダに適切なパラメタを与える
• X-MessageID
 • GUID
• X-WindowsPhone-Target
 • toast
• X-NotificationClass
 • 2, 12, 22 からどれか一つ
   • 与えた物によってデバイスへ配信されるタイミングが違う
トースト通知に使用するXML
<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
  <wp:Toast>
    <wp:Text1>タイトル</wp:Text1>
    <wp:Text2>メッセージ</wp:Text2>
    <wp:Param>タップ時に開くURI</wp:Param>
  </wp:Toast>
</wp:Notification>
実際に送信した場合のダンプ
POST /unthrottledt… HTTP/1.1
Host: notify.mpnf1.live-int.com
X-MessageID: 801972E5-E623-452a-BA4F-61AD596EC835
X-WindowsPhone-Target: toast
X-NotificationClass: 2
Content-Length: 242
Content-Type: text/xml

<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
  <wp:Toast>
    <wp:Text1>Hello</wp:Text1>
    <wp:Text2>Push Notification</wp:Text2>
    <wp:Param />
  </wp:Toast>
</wp:Notification>
DEMO
MPNSの実装例
• Amelloides
 • Twitterクライアント
 • バックエンドにWindows Azureを使ってます
 • Twitterでメンションを受け取るとMPNS経由で通知されます
MPNSの問題点
• 消費電力
• OSがMicrosoftのサーバと通信しそのセッション上に通知情報を流すた
  めバッテリ消費が増加する
• 無線LAN利用に不向き
• Windows Phoneの無線LANが端末スリープ状態になると切断されるので
  通知セッションが破棄されてしまう
 • Mangoで改善された?
• いまいち使いづらい
MPNSの制限
• 通知URLにXMLを送信する際データは最大1024Byteまで
• Toast通知はアプリケーション起動中には表示されない
• Raw通知はアプリケーション起動中にしか通知されない
• バッテリセーバが有効な場合は通知が実行されない
まとめ
• Push配信を使うことでWebのリアルタイムな変化を端末に配信で
  きる
• MPNSを使うと比較的簡単にPush通知を使用したアプリケーショ
  ンが作れる
• MPNSに対応すればそれだけでアプリケーションの付加価値に

よくわかるMPNS