WP7 - Push Notification基本概念詳述 - 1

Windows Phone 7 – Push Notification基本概念詳述 - 1

Push Notificiation的訴求為了是讓WP7在沒有辦法背景執行第三方程式的狀況下,仍然可以將遠端資料傳送

到WP7中,這是一個重點;另一個重點在於與Cloud Service(雲端服務)串聯起來。雲端效應其實被期待的除

了Cloud種類與硬體的整合之外,Mobile(泛指行動設備:智慧型手機或Pad系列產品等)也將是下一個雲端效

應下將會進展快速的一環。因此,WP7也希望藉此將Cloud Service加以整合進來。

 

WP7是以Silverlight為基礎為開發,因此,與後端資料庫或服務的操作往往都會透過WCF或RIA Service來完成。

Push Notification的概念,則是如下圖:

image

從上圖可以清楚看出三個角色:

‧Notifier (Web Service Provider)

可以稱之為通知者或是Notification服務提供者,身為該角色如果需要提供Notification的服務,便需要向

Microsoft Push Notification Service (MPNS)的伺服器註冊需要的Channel,配合Protocol與MPNS進行溝通。

 

‧Microsoft Push Notification Service (MPNS)

主要扮演中介者的角色,負責將Notifier欲發送的資料內容轉接給subscribers(如:WP App/Device)。

它接受由Notifier所申請的Service Name進行註冊,讓Push Client可以在建立Channel時指定需要的Service。

它也接受Push Client申請需要的Channel來進行溝通。

[註] Notifier送出的資訊會被MPNS存著,等MPNS與Push Client建立此Channel之後才會被送達Client端。

 

‧Push Client (Windows Phone Device/App)

Push Client要取得資料的話,則需要向MPNS建立起獨有的Channel,因此,Push Client會向MPNS送出詢問

是否存在指定的Service Name與專用的Channel名稱。例如:

   1: //The name the application uses to identify the notification channel instance.
   2: //該channelname參數是專屬該應用程式使用的。
   3: httpChannel=new HttpNotificationChannel(string channelname);
   4:  
   5: //The service name that the web service uses to associate itself with the Push Notification Service.
   6: //該service name來用代表web service註冊於NPS裡的name。
   7: httpChannel=new HttpNotificaitonChannel(string channelname, string servicename);

 

Notificatoin Type主要有:Tile、Toast、Raw三種。

‧Tile Nofitication

使用固定的XML格式做為傳輸資料的規範。通常是比較多視覺、動態的內容,支援修改WP Start畫面

中的Quick Launch area(例如:image ),包括:背景圖示、Tile或Title文字、計數器等。可參考此篇

傳輸的範例內容如下:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <wp:Notification xmlns:wp="WPNotification">
   3: <wp:Tile>
   4:  <wp:BackgroundImage><background image path></wp:BackgroundImage>
   5:  <wp:Count><count></wp:Count>
   6:  <wp:Title><title></wp:Title>
   7: </wp:Tile>
   8: </wp:Notification>

如果<background image path>是參考遠端檔案的話,該檔案最大Size 80KB。最長的下載時間是一分鐘

如果檔案過大或是超過1分鐘下載時間,則直接使用預設的Tile內容。

 

‧Toast Notification

使用固定的XML格式做為傳輸資料的規範。該類別比較像是即時通知,它會自動顯示於目前畫面中的最上方,

如果用戶點取那段訊息,將會直接啟動所屬訊息的應用程式,進一步完成接收完訊息之後的動作。

其傳輸的格式如下:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <wp:Notification xmlns:wp="WPNotification">
   3:  <wp:Toast>
   4:   <wp:Text1><string></wp:Text1>
   5:   <wp:Text2><string></wp:Text2>
   6:  </wp:Toast>
   7: </wp:Notification>

 

‧Raw Notification

使用自訂的XML格式,因此在Push Client端需要針對Raw Notification進行自訂的處理。該類型的使用只限於

當Application執行在前端時才能正常的傳遞。如果該程式變成了暫存模式(tombstoned),Notifier所送出的訊

息會被暫留在NPS中,等到Application回到啟動模式時,留在NPS中的內容會被在送達Client。

 

三種不同的Notification類型支援需要的種類,例如:像股票訊息或比較即時的通知訊息,可以使用Toast

Notification的類型,即時出現於用戶的Device上並且支援工作的處理;Tile Notication就比較適合做為廣告

的訊息或是有更新通知的訊息。但不管使用何種訊息,均需要Device有網際網路的能力。

 

[Notification傳送常見的情形]

(1). 傳送Tile Notification時,Push Client不正在Start畫面:

      正常的傳送至Push Client端,Quick lauch中的圖示自動更換。(代表Connection未斷線)。

      *如果該Application沒有建立在Start頁中的Quick Lanuch時,Notifier所收到的Notification Status是暫停的。

        =>如果重新把Application加到Quick Lanuch,被暫停的訊息仍然不會送到Push Client端。

(2). 傳送Toast Notification時,Push Client不在正Start畫面:

      正常的傳送至Push Client端,畫面正上方出現(包括application icon、訊息1與訊息2),存留時間約10秒。

      (代表Connection未斷線)。

(3). 傳送Raw Notification時,Push Client不在Application畫面時:

     訊息無法送達,Notifier會出現連線狀態正常,訂閱狀態正常,而Notification Status是被暫停的。因為Push

     Client端目前正與Channel連線。

     =>啟動Appliation:訊息送達,該訊息是上一封Notifier送出,但Notification Status是暫停的那一個訊息。

*推論:(以下是個人的推論,仍然要確認)

從上述三個案例說明:當建立一個Application具有可以接受Tile或Toast的Notification時,要特別注意:

Tile Notification:只有在Applicatoin被加入到Quick Lanuch時,才真正被Push Client端收到。(也表示有連線)

Toast Notification:只要你安裝了該Application就會被啟動Channel,代表連線是一直存在的。

Raw Notification:只有在Application正被執行時才能正確收到訊息,代表連線狀態只有在那個時候。

 

*此處提到的連線所指的是WP Device與MNPS建立起Channel連線的時候。

-------------------------

 

了解上述所介紹的Notification種類與運作的機制之後,另外接下來就是要了解到底整個準備使用Push Notification時,

各種角色之間需要準備與處理的工作內容。由於介紹WP7結合Nofitication Service的範例太多了,詳細的範別說明,

可參考[Reference]。因此,此篇就不太多作說明,只說出角色之間負責的工作與舉出Client端(Deivce)本身如何來使

用MPNS的部分:

‧Server端

實作Server端可以使用很多方式,包括:實作成Web App或Destktop App都可以。其主要的工作內容:

(1) 接受由Client端送過來的Request(其中包含:Client向MPNS註冊取得的Channel資訊)。

(2) 發送資訊給已向Server端註冊的Client端(發送方式則由Server端送給MPNS後,由MPNS轉給Client端)。

重點在於:取得Client向MPNS註冊而取得的Channel URI。這樣才有辦法讓Server端送出資訊給Client端。

 

‧Client端

Client端程式要實作步驟比較多一點,但這些步驟卻是必要的,大致上我把它畫成一張圖,如下:

圖片1

往上圖可以了解到,最重點就是要取得HttpNotificationChannel元件,並且透過註冊HttpNotificationChannel指定的

三個重要事件:ChannelUriUpdated(發生在取得MPNS註冊的資訊之後);HttpNotificationReceived(取得由Sender送

過的資訊內容);ErrorOccurred;來進行Notification的監聽,然而監聽的處理根據三種不同的訊息類型又有不同的

處理方法如下:

‧Raw Notification

如果是確定取得Notification的內容是Raw Notificatoin的內容,由於它本身傳送的內容規格只有開發人員資料,因此,

可以直接在HttpNotificationReceived事件中直接處理就可以了。

‧Tile / Toast Notification

接收固定MPNS規定之XML格式的內容,因此,在建立Channel且更新ChannelUri之後,就可以直接開始監聽功能,例如:

BindToShellToast (UnbindToShellToast)或是 BindToShellTile(UnbindToShellTile)。由於二者都是有固定的規格,

因此,當他們在HttpNotificationReceived事件發生後,則需要按照固定格式進行拆解。

 

最後你可以把取得Channel URI資訊儲存在Isolated Storage之中,此部分建議使用:

IsolatedStorageFile.GetUserStoreForApplication(),將該資訊儲存於該用戶專用的儲存區域內,當然,你也可以儲存

IsolatedStorageSettings的Key/Value之中。方便下一次連線時取得相關的HttpChaneel資訊。

 

[補充]

‧HttpNotificationChannel搜尋或建立Channel

HttpNotificaitonChannel.Find(channelName)方法針對MPNS搜尋建立過的Channel名稱。(搜尋時,如果上一次程式沒有

取得連線,該次Find的結果也是沒有連線功能的(ChannelUri屬性=null),因此建議使用ChannelUri屬性做識別。

new HttpNotificaitonChannel(channelName, serviceName):向MPNS建立Channel。(此方法如果連線失敗時,

並不會發出Exception,但可以透過ChannelUri屬性來判斷是否為Null。

 

以上是把一些WP7使用Notification Service的內容整理一下,由於相關的範例程式太多了,所以這篇加入了自己在學習

過程中的一些心得與應用。分享給大家。希望有幫助,如果有錯誤,也請指導。感謝。

 

References:

Push Notifications Overview for Windows Phone

How to: Set Up a Notification Channel for Windows Phone

How to: Send a Push Notification from a Web Service for Windows Phone

Push Notification Request and Response Format for Windows Phone

Windows Phone 7 - Push Notification機制初探

HttpNotificationChannel Constructor (String, String)

Push Notifications for Tiles with Windows Phone 7

 

 

 

 

 

Dotblogs 的標籤:,