2014-01-13 136 views
5

我搜索了官方論壇和文檔以及所有其他地方,但一直未能找到具體答案。Windows Phone 8通知和後臺任務

問:在Windows Phone 8中,應用程序是否可以響應推送通知,並在後臺執行任務?

至於我能理解,爲麪包和瓷磚通知,當應用程序是不是在前臺,沒有掛鉤它能夠對進入的消息作出響應,在所有。

我認爲「原始通知」是正確的選擇,因爲我不需要更新應用程序磁貼,甚至不需要顯示Toast通知。但是,如果我能做到這一點,我一直無法找到一個例子,或者在文件中。

我發現幾個環節,其談談做這個的Windows Store應用程序,但我想找出這是否可以爲的Windows Phone 8來完成。

我已經檢查這個其他線程,

Windows Phone 8 Background Task with notifications

如果答案的一個建議,WhatsApp的實際上有這樣的黑客,在收到推送通知後,下載的消息。所以,是我的問題的答案,NO

+0

我遇到了同樣的問題。但是,我如何從Bing新聞接收Toast通知,我甚至不使用他們的應用程序?如果我可以從Bing新聞應用程序的後臺任務獲得通知,那麼理論上它也應該與我的代碼一起工作。 –

回答

2

張貼這在Windows Phone的8.1改變。從Raw notification overview (Windows Runtime apps)

接聽原始通知

有兩種途徑,通過它您的應用程序可以接收原始 通知:

  • 通過通知傳遞的事件,而你的應用程序運行。
  • 如果您的應用程序啓用後臺任務,則通過原始通知觸發後臺任務。

應用程序可以使用這兩種機制來接收原始通知。如果一個應用程序 實現兩個通知傳遞的事件處理程序和背景由原始通知觸發 任務,通知 交付事件將應用程序運行時優先。

  • 如果應用程序正在運行,通知傳遞事件將優先於後臺任務,並且應用程序將有第一次處理通知的機會。
  • 通知傳遞事件處理程序可以通過將事件的PushNotificationReceivedEventArgs.Cancel屬性設置爲true來指定一旦處理程序退出,就不應將原始通知傳遞給其後臺任務。如果Cancel屬性設置爲false或未設置(默認值爲false),則原始通知將在通知傳遞事件處理程序完成其工作後觸發後臺任務。
+0

雖然我還沒有嘗試過這個,但文檔清楚地說現在這是可能的。所以,我正在改變接受的答案,只是相信你所解釋的內容,並且在提到你所選擇的鏈接之後。謝謝。 :) –

4

回答你的問題不完全是「NO」, 你是對的WhatsApp使用破解了這一點, WhatsApp的someyow使用AudioAgent,因爲他們被允許在後臺運行,

我不知道究竟怎麼了他們這樣做,我也搜索了相同的答案,讓我們來看看,如果我找到的東西在這裏

+0

感謝您的回答。我會等待更多的時間來看看我們能否得到更具體的答案,否則現在會接受你的答案。 –

0

這裏是在後臺接收推送通知的Windows Phone 8.1的完整指南:

  1. 得到一個推送通知通道URI:

    PushNotificationChannel _channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); 
    
    string ChannelUri = _channel.Uri; 
    

製作確定你確實通過記錄來獲取URI。保存URI並在每次啓動應用程序時運行它,因爲URI經常更新。

  • 創建解決方案內的Windows運行時組件項目: 右鍵單擊解決方案 - >添加 - >新建項目 - >選擇 「Windows運行時組件(Windows手機)」。稱這個項目爲「任務」或任何你喜歡的。

  • 創建一個新類,在新創建的項目中擴展IBackgroundTask。我打電話給我的 「NotificationReceiver」:

    using Windows.ApplicationModel.Background; 
    
    namespace Tasks { 
        public sealed class NotificationReceiver : IBackgroundTask { 
         public void Run(IBackgroundTaskInstance taskInstance) { 
          // TODO: implement your task here 
         } 
        } 
    } 
    
  • 你的任務將在這裏實現內部 「運行」 功能。

  • 參考您的運行時組件在您的主項目: 點擊您的Windows Phone項目 - >右鍵點擊「引用」 - >添加引用 - >勾選您的運行時組件,然後按好。

  • 編輯您的應用清單: 雙擊您的包清單 - >聲明 - >添加「位置」和「推送通知」到支持的任務類型,將您的後臺任務類名稱添加到入口點:調用mine 「Tasks.NotificationReceiver」。保存您的更改。

  • 每次啓動應用程序時取消註冊並註冊您的後臺任務。我給了完整的解決方案,只需撥打 「setupBackgroundTask()」:

    private void setupBackgroundTask() { 
        requestAccess(); 
        UnregisterBackgroundTask(); 
        RegisterBackgroundTask(); 
    } 
    
    private void RegisterBackgroundTask() { 
        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder(); 
        PushNotificationTrigger trigger = new PushNotificationTrigger(); 
        taskBuilder.SetTrigger(trigger); 
    
        taskBuilder.TaskEntryPoint = "Tasks.NotificationReceiver"; 
        taskBuilder.Name = "pushTask"; 
    
        try { 
         BackgroundTaskRegistration task = taskBuilder.Register(); 
         Logger.log("TASK REGISTERED"); 
        } catch (Exception ex) { 
         Logger.log("FAILED TO REGISTER TASK"); 
         UnregisterBackgroundTask(); 
        } 
    } 
    
    private bool UnregisterBackgroundTask() { 
        foreach (var iter in BackgroundTaskRegistration.AllTasks) { 
         IBackgroundTaskRegistration task = iter.Value; 
         if (task.Name == "pushTask") { 
          task.Unregister(true); 
          Logger.log("TASK UNREGISTERED"); 
          return true; 
         } 
        } 
        return false; 
    } 
    
    private async void requestAccess() { 
        BackgroundAccessStatus backgroundStatus = await BackgroundExecutionManager.RequestAccessAsync(); 
    } 
    
  • 讓你的任務裏面RawNotification對象:

    RawNotification notification = (RawNotification) taskInstance.TriggerDetails;