向 Windows 应用添加推送通知

概述

本教程介绍如何向 Windows 快速入门项目添加推送通知,以便每次插入一条记录时,向设备发送一条推送通知。

如果不使用下载的快速入门服务器项目,则需要推送通知扩展包。 有关详细信息,请参阅使用用于 Azure 移动应用的 .NET 后端服务器 SDK

配置通知中心

Azure 应用服务的移动应用功能使用 Azure 通知中心发送推送内容,因此用户需为移动应用配置通知中心。

  1. Azure 门户中,转到“应用服务”,并选择应用后端。 在“设置”下,选择“推送”

  2. 若要将通知中心资源添加到应用中,请选择“连接”。 可以创建一个中心,也可以连接到一个现有的中心。

    配置中心

现在已将通知中心连接到移动应用后端项目。 稍后需对此通知中心进行配置,以便连接到将内容推送到设备的平台通知系统 (PNS)。

为推送通知注册应用程序

需要将应用提交到 Microsoft Store,然后将服务器项目配置为与 Windows 推送通知服务 (WNS) 集成,以便发送推送。

  1. 在 Visual Studio 解决方案资源管理器中,右键单击 UWP 应用项目,单击“应用商店”>“将应用与应用商店关联...”。

    将应用与 Microsoft Store 相关联

  2. 在向导中,单击“下一步”,使用 Microsoft 帐户登录,在“保留新应用名称”中键入应用的名称,并单击“保留”

  3. 成功创建应用注册后,选择新应用名称,再依次单击“下一步”和“关联”。 这会将所需的 Microsoft Store 注册信息添加到应用程序清单中。

  4. 导航到应用程序注册门户,并使用 Microsoft 帐户登录。 单击上一步中关联的 Windows 应用商店应用。

  5. 在注册页中,记下“应用程序机密”和“包 SID”下的值,后面将使用这些值配置移动应用后端。

    将应用与 Microsoft Store 相关联

    重要

    客户端密钥和程序包 SID 是重要的安全凭据。 请勿将这些值告知任何人或随应用程序分发它们。 将“应用程序 ID”与机密配合使用来配置 Microsoft 帐户身份验证。

App Center 还提供了有关为推送通知配置 UWP 应用的说明。

配置后端以发送推送通知

  1. Azure 门户中,选择“浏览全部”>“应用程序服务”。 然后选择“移动应用”后端。 在“设置”下,选择“应用服务推送”。 然后选择通知中心名称。

  2. 转到“Windows (WNS)”。 输入安全密钥(客户端密码)和从 Live 服务站点获取的包 SID。 接下来,选择“保存”

    设置门户中的 WNS 密钥

后端现已配置为使用 WNS 发送推送通知。

更新服务器以发送推送通知

使用下面与后端项目类型(.NET 后端Node.js 后端)匹配的过程。

.NET 后端项目

  1. 在 Visual Studio 中,右键单击服务器项目并单击“管理 NuGet 包”,搜索 Microsoft.Azure.NotificationHubs,并单击“安装”。 这会安装通知中心客户端库。

  2. 展开“控制器”,打开 TodoItemController.cs,并添加以下 using 语句:

    using System.Collections.Generic;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Azure.Mobile.Server.Config;
    
  3. PostTodoItem 方法中,在调用 InsertAsync 后添加如下代码:

    // Get the settings for the server project.
    HttpConfiguration config = this.Configuration;
    MobileAppSettingsDictionary settings =
        this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
    // Get the Notification Hubs credentials for the Mobile App.
    string notificationHubName = settings.NotificationHubName;
    string notificationHubConnection = settings
        .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
    // Create the notification hub client.
    NotificationHubClient hub = NotificationHubClient
        .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
    // Define a WNS payload
    var windowsToastPayload = @"<toast><visual><binding template=""ToastText01""><text id=""1"">"
                            + item.Text + @"</text></binding></visual></toast>";
    try
    {
        // Send the push notification.
        var result = await hub.SendWindowsNativeNotificationAsync(windowsToastPayload);
    
        // Write the success result to the logs.
        config.Services.GetTraceWriter().Info(result.State.ToString());
    }
    catch (System.Exception ex)
    {
        // Write the failure result to the logs.
        config.Services.GetTraceWriter()
            .Error(ex.Message, null, "Push.SendAsync Error");
    }
    

    此代码指示通知中心在插入新项后,发送一条推送通知。

  4. 重新发布服务器项目。

Node.js 后端项目

  1. 设置后端项目。

  2. 将 todoitem.js 文件中的现有代码替换为以下内容:

    var azureMobileApps = require('azure-mobile-apps'),
    promises = require('azure-mobile-apps/src/utilities/promises'),
    logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    table.insert(function (context) {
    // For more information about the Notification Hubs JavaScript SDK,
    // see https://aka.ms/nodejshubs
    logger.info('Running TodoItem.insert');
    
    // Define the WNS payload that contains the new item Text.
    var payload = "<toast><visual><binding template=\ToastText01\><text id=\"1\">"
                                + context.item.text + "</text></binding></visual></toast>";
    
    // Execute the insert.  The insert returns the results as a Promise,
    // Do the push as a post-execute action within the promise flow.
    return context.execute()
        .then(function (results) {
            // Only do the push if configured
            if (context.push) {
                // Send a WNS native toast notification.
                context.push.wns.sendToast(null, payload, function (error) {
                    if (error) {
                        logger.error('Error while sending push notification: ', error);
                    } else {
                        logger.info('Push notification sent successfully!');
                    }
                });
            }
            // Don't forget to return the results from the context.execute()
            return results;
        })
        .catch(function (error) {
            logger.error('Error while running context.execute: ', error);
        });
    });
    
    module.exports = table;
    

    插入新的待办事项时,会发送一条包含 item.text 的 WNS toast 通知。

  3. 编辑本地计算机上的文件时,请重新发布服务器项目。

向应用程序添加推送通知

下一步,应用必须在启动时注册推送通知。 已启用身份验证时,请确保用户先登录,再尝试注册推送通知。

  1. 打开 App.xaml.cs 项目文件并添加以下 using 语句:

    using System.Threading.Tasks;
    using Windows.Networking.PushNotifications;
    
  2. 在同一文件中,将以下 InitNotificationsAsync 方法定义添加到 App 类中:

    private async Task InitNotificationsAsync()
    {
        // Get a channel URI from WNS.
        var channel = await PushNotificationChannelManager
            .CreatePushNotificationChannelForApplicationAsync();
    
        // Register the channel URI with Notification Hubs.
        await App.MobileService.GetPush().RegisterAsync(channel.Uri);
    }
    

    此代码从 WNS 检索应用的 ChannelURI,然后将该 ChannelURI 注册到应用服务移动应用。

  3. App.xaml.csOnLaunched 事件处理程序的顶部,为方法定义添加 async 修饰符,并添加对新 InitNotificationsAsync 方法的以下调用,如以下示例所示:

    protected async override void OnLaunched(LaunchActivatedEventArgs e)
    {
        await InitNotificationsAsync();
    
        // ...
    }
    

    这保证每次启动应用程序时都注册短期的 ChannelURI。

  4. 重新生成 UWP 应用项目。 应用现在已能够接收 toast 通知。

在应用程序中测试推送通知

  1. 右键单击 Windows 应用商店项目,单击“设为启动项目”,并按 F5 键运行 Windows 应用商店应用。

    该应用启动后,已注册该设备以接收推送通知。

  2. 停止 Windows 应用商店应用并对 Windows Phone 应用商店应用重复上一步操作。

    此时,这两个设备会注册以接收推送通知。

  3. 重新运行 Windows 应用商店应用,在“插入 TodoItem”中键入文本,并单击“保存”

    请注意,完成插入后,Windows Store 和 Windows Phone 应用会从 WNS 收到一条推送通知。 即使在此应用未运行时,也在 Windows Phone 上显示此通知。

后续步骤

了解有关推送通知的详细信息:

请考虑继续学习以下教程之一:

  • 向应用添加身份验证 了解如何使用标识提供者对应用用户进行身份验证。
  • 为应用启用脱机同步 了解如何使用移动应用后端向应用添加脱机支持。 脱机同步允许最终用户与移动应用交互(查看、添加或修改数据),即使在没有网络连接时也是如此。