上一篇文章中,已經完成了用於發送通知的服務器端,接下來我們就用這個服務端來測試一下。
在開始測試之前,我們要做一個接收通知的WP應用。
1、啟動VS Express for Windows,新建項目,在項目模板中選擇“空白應用程序(Windows Phone)”。
2、既然要接收通知,肯定少不了Toast、磁貼這幾樣常用的通知的,故我們得先准備一些圖片。
在“解決方案資源管理器”中,雙擊打開清單文件,切換到“可見資產”選項卡,這個“資產”指的不你的銀行卡存款有多少,而是你的應用中的一些如圖片、音樂等資源,可以不太好翻譯,就按單詞直譯了,反正你知道它是啥就行了。
我們看到,種圖標所需的尺寸都已經注明,注意每一類圖標都有三種比例,分別為100%,140%和240%。所以,對於每一種圖標,理論上我們需要分別准備三張圖片,假設圖片名字為abc,用於100%比例的圖片可以命名為abc.scale-100.png;對於140%比例的圖片,可以命名為abc.scale-140.png……中間多了個scale-XXX,XXX就是比例值。
如果你覺得麻煩,可以只為一種比例准備圖片即可,比如我只准備100%的所有圖片,不過,我們都知道,圖片放大后會變模糊,但縮小后不會變模糊。所以,我們應用選用比例最大的(240%)的標准來准備圖片文件。
舉個例子,初始屏幕,從窗口中的提示我們看到,240%比例所需的尺寸為1152×1920,我們就設計一張這樣大小的圖片,命名為xxx.scale-240.png,最好用PNG圖片,因為它允許背景透明,通常我們應當考慮使用透明背景,初屏幕的背景顏色可以另外設置。如下圖所示,為了支持環保事業,我把初始屏幕的背景色改為綠色。
這個例子用來測試,也不用設計得太認真,打開PS,隨便塗鴉幾張圖片就行了。為啥要用PS?有人說,用系統自帶的畫圖不就行了嗎?但是,你要知道,系統自帶的 畫圖 程序在繪制PNG圖像時,背景是非透明的,但PS在創建新內容時,可以選擇透明背景,如下圖所示。
有人又會問,PS是什么?PS就是PhotoShop的簡稱。
3、咱們干脆把鎖屏也用上,切換到“應用程序”選項卡,然后找到“通知”節,開啟Toast通知,並把鎖屏通知改為徽章和圖塊文本。
4、開啟鎖屏提醒后,必須設置后台任務,這個我們以后再扯,本示我們不需要后台任務,但也不能空在那里,切換到“聲明”選項卡,增加一個后台任務,在支持的類型處勾上“推送通知”;由於我們沒有開發后台任務,因此在入口點處填上當前應用中App類的名字,包括命名空間名稱。
保存並關閉清單文件。
5、打開MainPage頁面的代碼視圖,在OnNavigatedTo方法中加入以下代碼。
protected async override void OnNavigatedTo(NavigationEventArgs e) { PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); // 如果本地設置中沒有相關鍵,表明是第一次使用 // 需要存儲URL,並發送給服務器 //if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.ContainsKey("url")==false) //{ // Windows.Storage.ApplicationData.Current.LocalSettings.Values["url"] = channel.Uri; // SendURL(channel.Uri); //} //else //{ // string savedUrl = Windows.Storage.ApplicationData.Current.LocalSettings.Values["url"] as string; // // 當URL改變了,就重新發給服務器 // if (savedUrl != channel.Uri) // { // // 再次保存本地設置 // Windows.Storage.ApplicationData.Current.LocalSettings.Values["url"] = channel.Uri; // SendURL(channel.Uri); // } //} System.Diagnostics.Debug.WriteLine(channel.Uri); SendURL(channel.Uri); }
調用CreatePushNotificationChannelForApplicationAsync方法創建推送通道,然后把通道的URL發送給我們自己寫的服務器,服務器就是根據這個來向手機發送推送的。
注意被注釋掉的那段代碼,作用是把獲取到的通道URL保存到本地設置中,如果獲取到的新URL和本地設置中的URL相同,說明URL沒有改變,就不必把URL發給服務器了。
SendURL方法的作用是把通道URL發送給服務器,代碼如下:
private async void SendURL(string url) { using (HttpClient client =new HttpClient()) { byte[] data = System.Text.Encoding.UTF8.GetBytes(url); ByteArrayContent content = new ByteArrayContent(data); try { await client.PostAsync("http://192.168.1.100:85/svr/", content); } catch { } } }
好了,我們就剩下最重要的一步,就是設置應用程序的清單文件。還記得上一文章中,我們創建應用時得到的SID,App ID等幾個ID嗎?
在服務器端,使用這些信息來申請access token,在WP應用中我們也同樣需要把這些信息寫到清單文件中,這樣推送服務器才能進行推送,如果標識不匹配,就不會進行推送,防止有些別有用心的人自作多情,到處推送垃圾情書,造成信息污染。
那我們是不是打開清單文件,然后一個個改嗎?你要是原意的話,也無所謂。但是,我們是21世紀的高大上,不需要機械勞動,下面我給大家演示一下,如何智能地把商店中的應用信息同步到清單文件(如果你的應用已上傳到應用商店,就不需要這樣做了,但是在測試或學習階段,不要上傳)。
在“解決方案資源管理器”中右擊項目名,從快捷菜單中選擇“應用商店”->“將應用程序與應用商店關聯”,如下圖
或者,在VS的菜單欄中依次執行“應用商店”>“將應用程序與應用商店關聯”菜單。
這時候會出現一個向導,點 下一步。
這時需要輸入開發者帳號進行驗證。
驗證成功后,正在連接應用商店。
然后,在應用列表中選擇你需要同步的應用,這里我還是選上次創建的“示例應用”。
然后一路 下一步 ,直到完成為止。應用程序清單文件會自動修改。
================================================================
下面我們就可以測試了,首先記得要以管理員身份運行我們前面寫的服務器。輸入SID和客戶端密鑰,獲取access token。
運行WP手機客戶端應用,會獲取到通道URL並發送給服務器。
測試Toast通知
對WP來說,Toast只有ToastText02這個模板可用,就算你使用其他模板,它依然強制使用ToastText02模板。
修改XML模板,id為1的text無素設置toast標題,標題將以粗體顯示;id為2的text元素為內容,顯示為正常字體。
點擊發送后,在手機上你會看到奇跡的發生。
如果使用X-WNS-SuppressPopup標頭並設為true,Toast通知不會彈出,而是直接扔進操作中心隊列中了。
測試磁貼
要看到磁貼通知,先要把應用固定到“開始”屏幕。
然后選擇一個模板,並修改好XML內容,然后發送。
這時候,會看到手機“開始”屏幕上的磁貼已經更新。
也可以試試寬磁貼。
測試鎖屏通知
先到系統設置中,把應用程序加入到鎖屏序列中。
然后把手機鎖屏,就可以測試了。
請看屏幕下方。
源碼下載:http://files.cnblogs.com/tcjiaan/NotificationWPClApp.rar
對於RAW通知,可以與后台任務結合起來,即通過后台任務在后台來接收。關於這個,我們下一篇文章再扯。