天天看點

【WP 8.1開發】自定義(RAW)通知的使用

繼續前面的話題,還是推送通知。上一篇文章中遺留了RAW通知的推送沒有給各位示範,特特地留到現在,不為别的,隻為這個RAW通知有點意思,玩起來會比較有意思。官方文檔将RAW通知譯為“原始通知”,這裡還是沿用官方的翻譯。

在開始吹牛之前,先說一說與推送通知相關的要點。

有人說,如果我有22222222個用戶端,豈不是都要擷取每個手機用戶端的通道URL來推送嗎?是的。于是有人想到了所謂的“極光推送”,忽悠人的,“極光”顯然偷換了概念。我們得明确,在什麼情況下才會考慮使用推送。

推送好比伺服器與手機用戶端的“私人對話”,即當我們要為每一位客戶發送個性化的消息時,才叫推送,說白了,就是每個使用者收到的消息不相同,比如QQ就是這情況,每人的聊天記錄都不相同。要是你打算向所有客戶發送相同的資訊,就不應該使用推送,使用更簡單處理的Socket通信、或幹脆用Web/WCF服務,把消息放到服務上,每個用戶端自動去讀取。你可以結合背景任務,特别計劃背景,可以控制資訊更新的頻率(比如每天擷取一次),擷取到更新資訊再通過Toast或磁貼來提醒一下使用者就好了。

==============================================================

好了,廢話結束,下面是正文。

RAW通知比較靈活,它不像Toast、磁貼、鎖屏通知那樣需要嚴格遵守固定的XML格式,RAW通知的内容或結構都可以自己來定義,然後把通知内容POST到推送通道URL即可,在發送時建議使用UTF-8編碼,這樣遇到中文字元也不至于在用戶端收到亂碼,别然并不絕對地說一定會變成亂碼,但是謹慎一點肯定不是壞事。

在手機用戶端,一般我們會結合背景任務來接收RAW通知,這樣做的好處在于:

1、背景任務可以獨立、有計劃、有條件地運作,既不受前台UI影響,也不至于影響系統性能。大家都知道,WP手機是必須保持它刷刷刷地流暢的,不能因為我們開發的應用讓系統不再刷刷刷,這樣很不好。

2、有了背景接收,就算應用不在運作,都可以保證收到通知,前提是要有網絡可用。

好,我想一想,給大家做個什麼示範好呢?這樣吧,為了使示例更容易了解,假設我的伺服器端是一個電子商務平台,專門銷售山寨七匹林男裝的,每當有新的山寨品上架,服務會自動通知指定客戶優惠打折的通知,我們就用RAW通知來實作。

1、啟動VS,建立一個WP 8.1 應用程式。

2、在解決方案中添加一個“Windows 運作時元件”的項目,如下圖。

【WP 8.1開發】自定義(RAW)通知的使用

注意,是Windows運作時元件,不是類庫,不要建立類庫項目。

項目名字你自己取,比如叫“背景怪獸”也行。這個windows 運作時元件項目用來定義咱們的背景任務。

3、聲明一個類,并且這個類必須實作Windows.ApplicationModel.Background.IBackgroundTask接口,這個接口包含一個Run方法,我們要實作這個方法。

public sealed class NotifiBackTask:Windows.ApplicationModel.Background.IBackgroundTask
    {
        public void Run(Windows.ApplicationModel.Background.IBackgroundTaskInstance taskInstance)
        {
            // 在這裡編寫背景處理代碼

        }
    }      

下面是背景的實作代碼。

public void Run(Windows.ApplicationModel.Background.IBackgroundTaskInstance taskInstance)
        {
            // 在這裡編寫背景處理代碼
            Windows.Networking.PushNotifications.RawNotification notification = taskInstance.TriggerDetails as Windows.Networking.PushNotifications.RawNotification;

            if (notification != null)
            {
                // 擷取RAW通知的内容
                string message = notification.Content;
                // 由于内容是以|作為分隔符的,是以我們要取得标題和内容
                string[] items = message.Split('|');
                // 儲存資料
                Windows.Storage.ApplicationData.Current.LocalSettings.Values["title"] = items[0];
                Windows.Storage.ApplicationData.Current.LocalSettings.Values["content"] = items[1];
                // 更新磁貼
                Windows.Data.Xml.Dom.XmlDocument doc = Windows.UI.Notifications.TileUpdateManager.GetTemplateContent(Windows.UI.Notifications.TileTemplateType.TileSquare150x150Text02);
                var nodes = doc.SelectNodes("tile/visual/binding/text");
                if (nodes.Count >= 2)
                {
                    // 修改XML值
                    ((XmlElement)nodes[0]).InnerText = items[0];
                    ((XmlElement)nodes[1]).InnerText = items[1];
                }
                // 更新磁貼
                TileUpdateManager.CreateTileUpdaterForApplication().Update(new TileNotification(doc));

                // 順便也發一下Toast通知
                XmlDocument doctoast = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
                var txtnodes = doctoast.GetElementsByTagName("text");
                if (txtnodes.Count > 1)
                {
                    // 修改XML值
                    ((XmlElement)txtnodes[0]).InnerText = items[0];
                    ((XmlElement)txtnodes[1]).InnerText = items[1];
                }
                // 發送Toast通知
                ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(doctoast));
            }
      
  }      

當Run方法被調用時,會把一個實作了IBackgroundTaskInstance接口的對象執行個體通過參數傳遞進來,它表示目前正在執行的背景任務的執行個體。接着通過通路taskInstance.TriggerDetails屬性獲得一個跟觸發目前背景任務相關聯的對象。

我們這個背景任務是由于RAW通知到達而觸發的,是以,TriggerDetails屬性所引用的對象就是一個RawNotification執行個體,再經過Content屬性就能得到RAW通知的内容了。

我測試的時候,是用一個“|”符号把标題和正文分符開來,是以應用程式在收到通知後要對内容字元進行分割處理,以得到标題和正文。

最後,把收到的内容儲存到本地存儲中,并向使用者發送Toast提醒,同時更新磁貼。

4、回到WP應用項目,添加對剛才的背景任務的引用。

5、打開清單檔案,切換到“聲明”頁籤,添加一個背景任務,觸發器為“推送通知”,入口點為剛才定義的背景類的類名,包含命名空間名字。如下圖。

【WP 8.1開發】自定義(RAW)通知的使用

6、修改清單檔案僅僅是允許某個背景任務,要讓背景任務真正運作起來,還需要在代碼中進行注冊。

string taskName = "back_notifi"; //背景任務名稱
            string entryPoint = "RawNotificationBackgroundTask.NotifiBackTask"; //入口點
            // 檢查是否許背景任務
            var result = await BackgroundExecutionManager.RequestAccessAsync();
            if (result == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity)
            {
                // 檢查是否已經注冊背景任務
                var task = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault((t) => t.Name == taskName);
                // 如果未注冊,則進行注冊
                if (task == null)
                {
                    BackgroundTaskBuilder tb = new BackgroundTaskBuilder();
                    tb.TaskEntryPoint = entryPoint;
                    tb.Name = taskName;
                    // 觸發器為推送通知觸發器
                    tb.SetTrigger(new PushNotificationTrigger());
                    // 運作條件為網絡可用
                    tb.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
                    // 注冊
                    tb.Register();
                }
            }      

var task = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault((t) => t.Name == taskName);一行代碼是檢查一下背景任務是否已經注冊,如果已經注冊了,就不要再注冊了,背景任務的名字必須是唯一的,不能與其他背景任務重複。

記得:要将清單中的辨別與應用商店中的資訊同步,請參考上一篇文章。

7、現在,以管理者的身份運作我們前面開發的測試服務端,通知類型選擇“自定義”。

【WP 8.1開發】自定義(RAW)通知的使用

發送通知後,在手機上就會收到相應的通知,請看下面的美圖。

【WP 8.1開發】自定義(RAW)通知的使用
【WP 8.1開發】自定義(RAW)通知的使用
【WP 8.1開發】自定義(RAW)通知的使用

示例代碼下載下傳:https://files.cnblogs.com/tcjiaan/RawNotificationWPClientApp.rar

繼續閱讀