Windows Phone 8通知和后台任务
我搜索了官方论坛和文档以及所有其他地方,但一直未能找到具体答案。Windows Phone 8通知和后台任务
问:在Windows Phone 8中,应用程序是否可以响应推送通知,并在后台执行任务?
至于我能理解,为面包和瓷砖通知,当应用程序是不是在前台,没有挂钩它能够对进入的消息作出响应,在所有。
我认为“原始通知”是正确的选择,因为我不需要更新应用程序磁贴,甚至不需要显示Toast通知。但是,如果我能做到这一点,我一直无法找到一个例子,或者在文件中。
我发现几个环节,其谈谈做这个的Windows Store应用程序,但我想找出这是否可以为的Windows Phone 8来完成。
我已经检查这个其他线程,
Windows Phone 8 Background Task with notifications
如果答案的一个建议,WhatsApp的实际上有这样的黑客,在收到推送通知后,下载的消息。所以,是我的问题的答案,NO?
张贴这在Windows Phone的8.1改变。从Raw notification overview (Windows Runtime apps)
接听原始通知
有两种途径,通过它您的应用程序可以接收原始 通知:
- 通过通知传递的事件,而你的应用程序运行。
- 如果您的应用程序启用后台任务,则通过原始通知触发后台任务。
应用程序可以使用这两种机制来接收原始通知。如果一个应用程序 实现两个通知传递的事件处理程序和背景由原始通知触发 任务,通知 交付事件将应用程序运行时优先。
- 如果应用程序正在运行,通知传递事件将优先于后台任务,并且应用程序将有第一次处理通知的机会。
- 通知传递事件处理程序可以通过将事件的PushNotificationReceivedEventArgs.Cancel属性设置为true来指定一旦处理程序退出,就不应将原始通知传递给其后台任务。如果Cancel属性设置为false或未设置(默认值为false),则原始通知将在通知传递事件处理程序完成其工作后触发后台任务。
虽然我还没有尝试过这个,但文档清楚地说现在这是可能的。所以,我正在改变接受的答案,只是相信你所解释的内容,并且在提到你所选择的链接之后。谢谢。 :) –
回答你的问题不完全是“NO”, 你是对的WhatsApp使用破解了这一点, WhatsApp的someyow使用AudioAgent,因为他们被允许在后台运行,
我不知道究竟怎么了他们这样做,我也搜索了相同的答案,让我们来看看,如果我找到的东西在这里
感谢您的回答。我会等待更多的时间来看看我们能否得到更具体的答案,否则现在会接受你的答案。 –
这里是在后台接收推送通知的Windows Phone 8.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;
你的任务将在这里实现内部 “运行” 功能。
我遇到了同样的问题。但是,我如何从Bing新闻接收Toast通知,我甚至不使用他们的应用程序?如果我可以从Bing新闻应用程序的后台任务获得通知,那么理论上它也应该与我的代码一起工作。 –