如何使用 WNS 将原始推送通知传递到锁屏应用 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本主题向你展示 如何使用 Windows 通知服务 (WNS) 和原始推送通知在锁屏上的 Windows 运行时应用中在后台接收网络通知。本主题将指导你完成以下过程:注册推送通知通道并将其发送到服务器,注册要从原始推送通知激活的后台任务,将原始推送通知发送到通道,以及激活后台任务。

你需要了解的内容

技术

先决条件

  • 以下信息适用于任何依赖使用原始推送通知的网络连接始终连接的联网或网络感知的 Windows 运行时应用。本主题适用于在 Windows 8.1、Windows Phone 8.1 和 Windows Server 2012 R2 上采用 JavaScript 编写的应用。

    使用原始推送通知的后台网络连接受 JavaScript 应用、用 C++/XAML 编写的应用,以及以 C#、VB.NET 或托管 C++ 编写且使用 .NET Framework 4.5 的应用支持。 有关适用于 JavaScript 应用的后台网络连接任务的详细信息,请参阅使用后台任务支持应用

说明

使用 WNS 将原始推送通知传递到锁屏应用

使用 WNS 的应用不需要处于运行状态即可接收推送通知,让用户看起来好似应用正在运行(实际未运行)。例如,天气应用可以始终在更新的动态磁贴中显示最新天气。当重要事件发生时,WNS 也可以用于向用户传递屏幕通知。屏幕通知的一个好示例是一些重大新闻事件。运行 Windows 8.1、Windows Phone 8.1 或 Windows Server 2012 R2 的任何设备。通过连接到 Internet,可以使用 WNS。这些 WNS 通知在发送以后,通常会尽快传递。

尽管 WNS 有助于为 Windows 8.1 开始屏幕上的动态磁贴和通知增添功能,但是它也可用于支持实时连接方案,例如 IM、VoIP 和电子邮件。当使用 WNS 的应用添加到锁屏时,可以使用它激活后台任务。后台任务是你的应用代码的一部分,它在你的应用处于后台(不再位于前台)时运行。

可由 WNS 通知激活的一些后台任务示例包括:

  • 调用通知锁屏提醒 API 以递增锁屏上电子邮件应用的锁屏提醒图标,以指示有新电子邮件到达。
  • 调用通知 Toast API 以引发 VoIP 应用的通知,从而为用户发出来电信号。

有四种类型的推送通知:

  • 磁贴更新
  • 锁屏提醒更新
  • Toast 通知
  • 原始通知

在前台运行时,所有 Windows 运行时应用都可以使用前三种推送通知。只有锁屏应用可以从 WNS 接收原始推送通知。当原始推送通知从 WNS 到达时(甚至应用不在前台运行时),原始通知允许锁屏应用以后台任务的形式运行代码。

大多数应用不需要成为锁屏应用,可以不在锁屏上使用 WNS。在前台运行时,所有应用都可以使用 WNS 更新磁贴和锁屏提醒,还可以引发 Toast 通知。对锁屏应用使用 WNS 是使用 WNS 向用户点亮动态磁贴和引发通知的更高级版本。尝试对锁屏使用 WNS 之前,开发人员应该熟悉 MSDN 上的 WNS 文档。有关详细信息,请参阅推送通知概述

你需要使用已通过 Windows 应用商店设置的密钥将推送通知发送到 WNS。有关使用 WNS 进行验证和配置应用的详细信息,请参阅如何使用 Windows 推送通知服务 (WNS) 进行验证.

以下步骤展示如何向锁屏应用发送原始推送通知。

  • 注册 WNS 推送通知通道并将其发送到服务器。
  • 使用通知通道将格式正确的原始推送通知发送到 WNS。
  • 编写从原始推送通知激活的后台任务。

通过向通知通道执行格式正确的 XML 负载的 HTTP PUSH,使用开发人员的应用服务器传递原始推送通知。通知通道由客户端应用生成,发送到应用服务器,并用于发送推送通知。在 Windows 8.1 上,对于用户帐户上的应用实例来说,通知通道是独一无二的。

JJ679947.wedge(zh-cn,WIN.10).gif注册推送通知通道并将其发送到服务器

  1. 通过调用 Windows.Networking.PushNotifications 命名空间中 PushNotificationChannelManager 类上的 CreatePushNotificationChannelForApplicationAsync 方法之一注册通道。

    这将为你的应用生成推送通知通道,如下所示:

    https://db3.notify.windows.com/?token=AQQAAADX3Wr8MA%2fCoZk4n1CmR5ZU7tdic6ksvG4TQq1tiyZtpetjfzuPHSjvliEeqaqJcPuo1jrVnbyCZvnbuU%2byLvZNDONTgUNu6lavpl5EGtWx7iQgpGkyHLbZeosxioQ42Cg%3d
    
  2. 将通道发送至服务器。通道于 30 天后过期,因此存在以下最佳实践:

    • 每次启动你的应用时,注册以获取新推送通知通道,并将其发送到你的服务器以替换以前绑定到用户的通道。
    • 对于始终保持开机状态的本地计算机,在通道过期前不时运行后台任务续订通道。这称为“维护计时器”。

JJ679947.wedge(zh-cn,WIN.10).gif注册要从原始推送通知激活的后台任务

  1. 若要构建在收到原始推送通知时运行的后台任务,你必须指定一个 JavaScript 源文件,该文件中必须包含要通过后台任务激活的代码。为此,你必须确保你的应用部件清单 (manifest) 指向后台任务的源文件。应用部件清单 (manifest) 必须包含后台任务的 JavaScript 源文件的名称。

    以下示例将 PushNotifyTask 后台任务的扩展添加到应用部件清单 (manifest) 中的 <Application> 元素下。

      <Extensions>
        <Extension Category="windows.backgroundTasks" StartPage="js\backgroundTask.js">
          <BackgroundTasks>
            <Task Type="pushNotification" />
          </BackgroundTasks>
        </Extension>
      </Extensions>
    
  2. 该应用需要为原始推送通知打开通道。

    以下示例展示如何为原始推送通知打开通道。

    
        // Open the channel. See the "Push and Polling Notifications" sample for more detail
        function openNotificationsChannel() {
            var channelOperation = pushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync();
            WinJS.log && WinJS.log("Opening a channel...", "sample", "status");
            return channelOperation.then(function (newChannel) {
                WinJS.log && WinJS.log("Channel request succeeded!", "sample", "status");
                document.getElementById("scenario1ChannelOutput").value = newChannel.uri;
                SdkSample.channel = newChannel;
            },
                function (error) {
                    WinJS.log && WinJS.log("Could not create a channel (error number: " + error.number + ")", "sample", "error");
                }
            );
        }
    
  3. 应用还必须注册要在收到原始推送通知时激活的后台任务。

    以下示例展示如何注册原始推送通知的后台任务。

        // Register the background task for raw notifications
        //
        function registerBackgroundTask() {
            var taskBuilder = new background.BackgroundTaskBuilder();
            var trigger = new background.PushNotificationTrigger();
            taskBuilder.setTrigger(trigger);
            taskBuilder.taskEntryPoint = sampleTaskEntryPoint;
            taskBuilder.name = sampleTaskName;
    
            try {
                var task = taskBuilder.register();
                task.addEventListener("completed", backgroundTaskComplete);
                WinJS.log && WinJS.log("Background task registered", "sample", "status");
            } catch (e) {
                WinJS.log && WinJS.log("Registration error: " + e.message, "sample", "error");
                unregisterBackgroundTask();
            }
        }
    
        function unregisterBackgroundTask() {
            var iter = background.BackgroundTaskRegistration.allTasks.first();
            while (iter.hasCurrent) {
                var task = iter.current.value;
                if (task.name === sampleTaskName) {
                    task.unregister(true);
                    return true;
                }
                iter.moveNext();
            }
            return false;
        }
    
  4. 你也需要为触发后台任务时运行的函数提供代码。

    有关如何编写后台任务以接收使用原始推送通知的后台网络通知的详细信息,请参阅如何为原始推送通知编写后台任务

    注意  

    你无法在后台任务中引用你的应用的用户界面 (UI) 元素,因为你的应用中的 UI 元素未运行。这意味着,网络传输的任何回调都无需关联到 UI 单线程单元 (STA)。后台任务无需访问已关联到 UI STA(也称为应用 STA)的所有对象。

    当你的代码在后台任务中执行时,你可以设置激活应用,同步客户端和服务器之间的状态,并引发对用户的通知。

     

原始推送通知类似于锁屏提醒和磁贴通知。主要区别是原始推送通知的负载不包含用于更新 Windows 8.1 用户界面部分的属性。原始推送通知的负载全都是在激活后台任务时直接传递到你的应用的上下文数据。应用必须理解服务器发送的上下文数据的格式。

在服务器可以发送原始推送通知前,必须执行以下操作:

JJ679947.wedge(zh-cn,WIN.10).gif将原始推送通知发送到通道并激活后台任务

  1. 确保你已经在 Windows 应用商店注册你的应用,并且已有私钥和程序包 SID。

  2. 在发送服务器中的推送通知前,在应用服务器上编写代码以通过 WNS 使用私钥和程序包 SID 进行身份验证。

  3. 正确设计 WNS 原始推送通知并执行你前面从 Windows 运行时应用接收到的通知通道的 HTTP POST。HTTP POST 应该包含多个其他 HTTP 标头:

    • X-WNS-Type=wns/raw
    • Content-Type=application/octet-stream
    • Authorization=字符串“Bearer”,一个空格,然后是从身份验证步骤收到的授权标记

    HTTP POST 的正文应包括当它运行通过接收原始推送通知触发的后台任务时要提供给客户端应用的所有上下文。可包含在原始通知负载中的最大数据量是 5KB。

    客户端收到通知时,将激活后台任务,并通过应用的后台任务代码传入和访问指定的数据负载。

先前步骤

有关如何创建锁屏应用以接收使用原始推送通知的后台网络通知的详细信息,请参阅快速入门:创建使用后台原始推送通知的锁屏应用

后续步骤

有关如何编写后台任务以接收使用原始推送通知的后台网络通知的详细信息,请参阅如何为原始推送通知编写后台任务

有关使用原始推送通知的指南和清单的详细信息,请参阅

原始通知指南和清单

相关主题

其他资源

添加网络支持

后台网络

原始通知指南和清单

如何使用 Windows 推送通知服务 (WNS) 进行验证

如何使用 WNS 将原始推送通知传递到锁屏应用

如何为原始推送通知编写后台任务

锁屏概述

推送通知概述

如何创建使用后台原始推送通知的锁屏应用

使用后台任务支持应用

网络连接的故障排除和调试

参考

HttpClient

HttpClientHandler

IXMLHTTPRequest2

System.Net.Http

Windows.ApplicationModel.Background

Windows.Networking.BackgroundTransfer

Windows.Networking.PushNotifications

Windows.Networking.Sockets

Windows.Web.Http

示例

后台任务示例

锁屏应用示例

推送和定期通知客户端示例

原始通知示例