標籤:style blog http io color ar os 使用 for
簡單介紹:
Windows phone平台支援三種形式的推播通知:
1.Tile——也就是在Start螢幕程式平鋪表徵圖
2.Toast——建立一個顯示在當前螢幕中的Toast快顯視窗
3.Raw——有應用程式自己來處理的通知:對於使用者是透明的。
這三種推送的過程是相同的,都涉及到三方:Windows phone應用程式、雲端式的通知服務(Notification Service,由微軟提供)、通知源。
推播通知的過程如所示:
順序如下:1、具有訊息推送功能的應用發出訊息推送
2、向微軟推播通知服務(MPNS)請求URI,並返回推播通知的URI(此URI是根據裝置、手機應用程式、通道名稱組合而成的唯一標識)
3、應用拿到URI
4、將拿到的URI告訴通知雲端服務(也就是通知源)
5、如果雲端服務(通知源)有要傳給Windows phone應用的通知,便通過此URI想MPNS發送Post請求,其中也就包含了推送的訊息內容
6、接著就是MPNS向對應URI的裝置發送推播通知
Toast推播通知
Toast推動通知顯示的樣式如下:
它由三部分構成:1、Title。也就是中顯示的 “標題” 部分。緊挨著你的應用的表徵圖。在XML中(通知源發送過來的訊息是將XML內容編碼後傳送的),該字串定義為Text1屬性
2、Content。圖中的 ”內容" 部分。在XML中,定義為Text2屬性
3、Parament。指的是參數,點擊Toast後,會把這個參數傳給你的應用程式。其中可以指示你要啟動的你應用中的頁面,還可以帶有名稱-值對,在應用中可以進行使用。在XML中定義為Param屬性。
代碼
手機應用程式端
1 /// 推播通知通道 2 HttpNotificationChannel pushChannel; 3 4 // 通道的名稱,可以自行命名 5 string channelName = "ToastSampleChannel"; 6 7 // 去找某個名稱的通道,若是有返回一個HttpNotificationChannel類型的通道,沒有找到幾位null 8 pushChannel = HttpNotificationChannel.Find(channelName); 9 10 // 沒找到的話,就以此名稱建立一個通道11 if (pushChannel == null)12 {13 pushChannel = new HttpNotificationChannel(channelName);14 15 // 新到的Uri更新時觸發該事件,此事件一定要註冊16 pushChannel.ChannelUriUpdated +=PushChannel_ChannelUriUpdated;17 //為了提高系統的容錯,可以進行錯誤的捕獲18 pushChannel.ErrorOccurred += PushChannel_ErrorOccurred;19 20 // 這個事件註冊是可選的,當推播通知來了,程式正在運行,則會引發該事件,在此處可隨意對傳來的訊息進行處理21 pushChannel.ShellToastNotificationReceived += PushChannel_ShellToastNotificationReceived;22 //開啟通道23 pushChannel.Open();24 25 // 將通道綁定到Toast推播通知,否則26 pushChannel.BindToShellToast();27 28 }29 else//通道已經存在,則不需要繼續建立通道,直接註冊時間即可30 {31 pushChannel.ChannelUriUpdated += PushChannel_ChannelUriUpdated;32 pushChannel.ErrorOccurred += PushChannel_ErrorOccurred;33 34 pushChannel.ShellToastNotificationReceived += PushChannel_ShellToastNotificationReceived;35 36 // 當測試的時候顯示通道的URI37 System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString());38 39 }40 }41 42 void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)43 {44 45 Dispatcher.BeginInvoke(() =>46 {47 // 當測試的時候顯示通道的URI48 System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());49 MessageBox.Show(String.Format("Channel Uri is {0}",50 e.ChannelUri.ToString()));51 52 });53 }54 void PushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)55 {56 // 推播通知中的錯誤處理,此處就是簡單進行顯示57 Dispatcher.BeginInvoke(() =>58 MessageBox.Show(String.Format("A push notification {0} error occurred. {1} ({2}) {3}",59 e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData))60 );61 }62 void PushChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)63 {64 StringBuilder message = new StringBuilder();65 string relativeUri = string.Empty;66 67 message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());68 69 // 顯示傳動過來的訊息,以名稱-值得方式70 foreach (string key in e.Collection.Keys)71 {72 message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);73 74 if (string.Compare(75 key,76 "wp:Param",77 System.Globalization.CultureInfo.InvariantCulture,78 System.Globalization.CompareOptions.IgnoreCase) == 0)79 {80 relativeUri = e.Collection[key];81 }82 }83 84 // Display a dialog of all the fields in the toast.85 Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));86 87 }
以上代碼是微軟給的範例程式碼,進行了簡單的說明。
提醒:1、為了更方便的使用推播通知,可以將以上代碼寫在一個類中,還可以增強他的功能。比如程式中加入可以控制是否需要通知的CheckButton按鈕等
2、如果想在跳轉到的頁面中提取Param中的其他資訊的話,可以使用類似這樣的代碼(其中NavigateFrom和Other是Param參數中加入的名稱-值對中的名稱,當然要隨著通知源做相應的修改):
if (NavigationContext.QueryString.TryGetValue("NavigateFrom", out _navigateFrom)) { _otherThing= NavigationContext.QueryString["Other"]; }
通知源端
這部分的代碼就不貼了,大家可以參考MSDN中相應的內容。
看一下發送的訊息的格式:
string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<wp:Notification xmlns:wp=\"WPNotification\">" + "<wp:Toast>" + "<wp:Text1>" + TextBoxTitle.Text.ToString() + "</wp:Text1>" + "<wp:Text2>" + TextBoxSubTitle.Text.ToString() + "</wp:Text2>" + "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" + "</wp:Toast> " + "</wp:Notification>";
其中就包含了上面所說的Toast含有的三個屬性:Text1(標題)、Text2(內容)、Param(參數)。
注意:1、Param中可以有一個.xaml頁面,就是即將跳轉到的頁面;後面跟的就是名稱-值對(可以包含多對,但每個名稱-值對之間要使用 “&” 來加以區分;如果此處Param中名稱-值對使用的是 “&” ,就還需要代碼進行轉義符處理)。
2、如果想推送中文的訊息,注意在編碼的時候使用UTF8進行編碼,如同
byte[] notificationMessage = Encoding.UTF8.GetBytes(toastMessage);
3、還要注意推送訊息的長度也有一定的限制,否則會產生現實問題、或是推送不了等。
用時:1h15m (哎寫的太慢了)
Windows phone Toast訊息推送 學習筆記