Windows phone Toast訊息推送 學習筆記

來源:互聯網
上載者:User

標籤: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頁面,就是即將跳轉到的頁面;後面跟的就是名稱-值對(可以包含多對,但每個名稱-值對之間要使用 “&amp” 來加以區分;如果此處Param中名稱-值對使用的是 “&” ,就還需要代碼進行轉義符處理)。

     2、如果想推送中文的訊息,注意在編碼的時候使用UTF8進行編碼,如同     

byte[] notificationMessage = Encoding.UTF8.GetBytes(toastMessage);

             3、還要注意推送訊息的長度也有一定的限制,否則會產生現實問題、或是推送不了等。

 

用時:1h15m  (哎寫的太慢了)

Windows phone Toast訊息推送 學習筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.