将推送通知添加到 Xamarin.Forms 应用

概述

在本教程中,将推送通知添加到 Xamarin.Forms 快速入门生成的所有项目。 这意味着每次插入记录时,都会向所有跨平台客户端发送推送通知。

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

先决条件

对于 iOS,你需要 Apple 开发人员计划成员资格 和物理 iOS 设备。 iOS 模拟器不支持推送通知。

配置通知中心

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

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

  2. 若要向应用添加通知中心资源,请选择 连接。 可以创建中心或连接到现有中心。

    配置集线器

现在,已将通知中心连接到移动应用后端项目。 稍后,请将此通知中心配置为连接到平台通知系统(PNS),以推送到设备。

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

在本部分中,将更新现有移动应用后端项目中的代码,以每次添加新项时发送推送通知。 此过程由 Azure 通知中心的 模板 功能提供支持,该功能支持跨平台推送。 各种客户端都使用模板注册推送通知,单个通用推送可以访问所有客户端平台。

选择以下过程之一,该过程应与您的后端项目类型匹配:.NET 后端Node.js 后端

.NET 后端项目

  1. 在 Visual Studio 中,右键单击服务器项目。 然后选择 管理 NuGet 包。 搜索 Microsoft.Azure.NotificationHubs,然后选择 安装。 此过程安装通知中心库,用于从后端发送通知。

  2. 在服务器项目中,打开 控制器>TodoItemController.cs。 然后使用以下语句添加:

    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 a new Notification Hub client.
    NotificationHubClient hub = NotificationHubClient
    .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
    // Send the message so that all template registrations that contain "messageParam"
    // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
    Dictionary<string,string> templateParams = new Dictionary<string,string>();
    templateParams["messageParam"] = item.Text + " was added to the list.";
    
    try
    {
        // Send the push notification and log the results.
        var result = await hub.SendTemplateNotificationAsync(templateParams);
    
        // 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 template payload.
    var payload = '{"messageParam": "' + context.item.text + '" }';  
    
    // 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 template notification.
                context.push.send(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 的模板通知。

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

配置并运行 Android 项目(可选)

完成本部分,为适用于 Android 的 Xamarin.Forms Droid 项目启用推送通知。

启用 Firebase Cloud Messaging (FCM)

  1. 登录到 Firebase 控制台。 如果还没有 Firebase 项目,创建一个新项目。

  2. 创建项目后,选择“向 Android 应用添加 Firebase”。

    将 Firebase 添加到 Android 应用

  3. 在“将 Firebase 添加到 Android 应用”页上,执行以下步骤:

    1. 对于“Android 程序包名称”,请在应用程序的 build.gradle 文件中复制 applicationId 的值。 在此示例中,它是 com.fabrikam.fcmtutorial1app

      指定程序包名称

    2. 选择“注册应用”。

  4. 选择“下载 google-services.json”,将该文件保存到项目的 app 文件夹中,然后选择“下一步”

    下载 google-services.json

  5. 在 Android Studio 中对你的项目进行以下配置更改

    1. 在项目级 build.gradle 文件 (<project>/build.gradle) 中,向 dependencies 部分中添加以下语句。

      classpath 'com.google.gms:google-services:4.0.1'
      
    2. 在应用级 build.gradle 文件 (<project>/<app-module>/build.gradle) 中,向 dependencies 部分中添加以下语句。

      implementation 'com.google.firebase:firebase-core:16.0.8'
      implementation 'com.google.firebase:firebase-messaging:17.3.4'
      
    3. 在应用级 build.gradle 文件的末尾,在 dependencies 部分后面添加以下行。

      apply plugin: 'com.google.gms.google-services'
      
    4. 在工具栏上选择“立即同步”。

      build.gradle 配置更改

  6. 选择“下一步”。

  7. 选择“跳过此步骤”

    跳过最后一步

  8. 在 Firebase 控制台中,选择与项目相对应的齿轮图标。 然后,选择“项目设置”。

    选择“项目设置”

  9. 如果尚未将 google-services.json 文件下载到你的 Android Studio 项目的 app 文件夹中,则可以在此页面上执行此操作。

  10. 切换到顶部的“Cloud Messaging”选项卡。

  11. 复制并保存服务器密钥以供将来使用。 您可以使用此值来配置集线器。

配置移动应用后端以使用 FCM 发送推送请求

  1. Azure 门户中,选择“”浏览所有>应用服务。 然后选择移动应用后端。
  2. 设置中,选择 推送。 然后选择 配置推送通知服务
  3. 前往 谷歌(GCM)。 输入从 Firebase 控制台获取的 FCM 旧版服务器密钥,然后选择 保存

服务现已配置为使用 Firebase Cloud Messaging。

向 Android 项目添加推送通知

使用 FCM 配置后端后,可以将组件和代码添加到客户端,以向 FCM 注册。 还可以通过移动应用后端向 Azure 通知中心注册推送通知,并接收通知。

  1. Droid 项目中,右键单击 “引用 > 管理 NuGet 包...”
  2. 在 NuGet 包管理器窗口中,搜索 Xamarin.Firebase.Messaging 包并将其添加到项目中。
  3. Droid 项目的项目属性中,将应用设置为使用 Android 版本 7.0 或更高版本进行编译。
  4. 将从 Firebase 控制台下载的 google-services.json 文件添加到 Droid 项目的根目录,并将其生成操作设置为 GoogleServicesJson。 有关详细信息,请参阅 添加 Google Services JSON 文件

注册到 Firebase Cloud Messaging

  1. 打开 AndroidManifest.xml 文件,并将以下 <receiver> 元素插入到 <application> 元素中:

    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
    

实现 Firebase 实例 ID 服务

  1. 将一个新类添加到名为 FirebaseRegistrationServiceDroid 项目,并确保文件顶部存在以下using语句:

    using System.Threading.Tasks;
    using Android.App;
    using Android.Util;
    using Firebase.Iid;
    using Microsoft.WindowsAzure.MobileServices;
    
  2. 将空 FirebaseRegistrationService 类替换为以下代码:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class FirebaseRegistrationService : FirebaseInstanceIdService
    {
        const string TAG = "FirebaseRegistrationService";
    
        public override void OnTokenRefresh()
        {
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            Log.Debug(TAG, "Refreshed token: " + refreshedToken);
            SendRegistrationTokenToAzureNotificationHub(refreshedToken);
        }
    
        void SendRegistrationTokenToAzureNotificationHub(string token)
        {
            // Update notification hub registration
            Task.Run(async () =>
            {
                await AzureNotificationHubService.RegisterAsync(TodoItemManager.DefaultManager.CurrentClient.GetPush(), token);
            });
        }
    }
    

    FirebaseRegistrationService 类负责生成安全令牌,以授权应用程序访问 FCM。 OnTokenRefresh当应用程序从 FCM 接收注册令牌时,将调用该方法。 该方法从 FirebaseInstanceId.Instance.Token 属性检索令牌,该属性由 FCM 异步更新。 OnTokenRefresh该方法不常调用,因为仅当安装或卸载应用程序时、用户删除应用程序数据、应用程序擦除实例 ID 或令牌安全已泄露时,令牌才会更新。 此外,FCM 实例 ID 服务将请求应用程序定期刷新其令牌,通常每隔 6 个月刷新一次。

    OnTokenRefresh 方法还调用了 SendRegistrationTokenToAzureNotificationHub 方法,用于将用户的注册令牌与 Azure 通知中心相关联。

注册到 Azure 通知中心

  1. 将一个新类添加到名为 AzureNotificationHubServiceDroid 项目,并确保文件顶部存在以下using语句:

    using System;
    using System.Threading.Tasks;
    using Android.Util;
    using Microsoft.WindowsAzure.MobileServices;
    using Newtonsoft.Json.Linq;
    
  2. 将空 AzureNotificationHubService 类替换为以下代码:

    public class AzureNotificationHubService
    {
        const string TAG = "AzureNotificationHubService";
    
        public static async Task RegisterAsync(Push push, string token)
        {
            try
            {
                const string templateBody = "{\"data\":{\"message\":\"$(messageParam)\"}}";
                JObject templates = new JObject();
                templates["genericMessage"] = new JObject
                {
                    {"body", templateBody}
                };
    
                await push.RegisterAsync(token, templates);
                Log.Info("Push Installation Id: ", push.InstallationId.ToString());
            }
            catch (Exception ex)
            {
                Log.Error(TAG, "Could not register with Notification Hub: " + ex.Message);
            }
        }
    }
    

    该方法 RegisterAsync 创建一个简单的通知消息模板作为 JSON,并使用 Firebase 注册令牌注册从通知中心接收模板通知。 这可确保从 Azure 通知中心发送的任何通知都以注册令牌表示的设备为目标。

显示推送通知的内容

  1. 将一个新类添加到名为 FirebaseNotificationServiceDroid 项目,并确保文件顶部存在以下using语句:

    using Android.App;
    using Android.Content;
    using Android.Media;
    using Android.Support.V7.App;
    using Android.Util;
    using Firebase.Messaging;
    
  2. 将空 FirebaseNotificationService 类替换为以下代码:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class FirebaseNotificationService : FirebaseMessagingService
    {
        const string TAG = "FirebaseNotificationService";
    
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
    
            // Pull message body out of the template
            var messageBody = message.Data["message"];
            if (string.IsNullOrWhiteSpace(messageBody))
                return;
    
            Log.Debug(TAG, "Notification message body: " + messageBody);
            SendNotification(messageBody);
        }
    
        void SendNotification(string messageBody)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            //Unique request code to avoid PendingIntent collision.
            var requestCode = new Random().Next();
            var pendingIntent = PendingIntent.GetActivity(this, requestCode, intent, PendingIntentFlags.OneShot);
            var notificationBuilder = new NotificationCompat.Builder(this)
                .SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
                .SetContentTitle("New Todo Item")
                .SetContentText(messageBody)
                .SetContentIntent(pendingIntent)
                .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
                .SetAutoCancel(true);
    
            var notificationManager = NotificationManager.FromContext(this);
            notificationManager.Notify(0, notificationBuilder.Build());
        }
    }
    

    当应用程序从 FCM 收到通知时,会调用OnMessageReceived方法,提取消息内容,然后调用SendNotification方法。 此方法将消息内容转换为应用程序运行时启动的本地通知,通知显示在通知区域中。

现在,你已准备好在 Android 设备或模拟器上运行的应用中测试推送通知。

在 Android 应用中测试推送通知

仅当在模拟器上进行测试时,才需要前两个步骤。

  1. 请确保在配置了 Google Play Services 的设备或模拟器上部署或调试。 可以通过检查是否已在设备或模拟器上安装 Play 应用来验证这一点。
  2. 单击 “应用>设置>添加帐户”,将 Google 帐户添加到 Android 设备。 然后,按照提示将现有 Google 帐户添加到设备,或创建新的帐户。
  3. 在 Visual Studio 或 Xamarin Studio 中,右键单击 Droid 项目,然后单击“ 设置为启动项目”。
  4. 单击“ 运行 ”以生成项目并在 Android 设备或模拟器上启动应用。
  5. 在应用中,键入任务,然后单击加号(+)图标。
  6. 验证是否在添加项目时收到通知。

配置并运行 iOS 项目(可选)

本部分用于运行适用于 iOS 设备的 Xamarin iOS 项目。 如果不使用 iOS 设备,可以跳过本部分。

生成证书签名请求文件

Apple Push Notification 服务 (APNs) 使用证书对推送通知进行身份验证。 请遵照这些说明来创建用于发送和接收通知的所需推送证书。 有关这些概念的详细信息,请参阅正式的 Apple Push Notification 服务文档。

生成证书签名请求 (CSR) 文件,Apple 将使用该文件生成签名的推送证书。

  1. 在 Mac 上,运行 Keychain Access 工具。 可以从启动台上的 UtilitiesOther 文件夹中打开该工具。

  2. 选择 Keychain Access,展开证书助理,然后选择从证书颁发机构请求证书。

    使用 Keychain Access 请求新证书

    注释

    默认情况下,Keychain Access 选择列表中的第一项。 如果你位于 Certificates(证书)类别中,并且 Apple Worldwide Developer Relations Certification Authority(Apple 全球开发者关系证书颁发机构)不是列表中的第一项,这可能会是个问题。 在生成 CSR(证书签名请求)之前,请确保已有非密钥项,或者已选择 Apple Worldwide Developer Relations Certification Authority(Apple 全球开发者关系证书颁发机构)密钥。

  3. 选择 User Email Address(用户电子邮件地址),输入 Common Name(公用名)值,确保指定 Saved to disk(保存到磁盘),然后选择 Continue(继续)。 将 CA Email Address(CA 电子邮件地址)留空,因为它不是必填字段。

    必需的证书信息

  4. Save As(另存为)中为 CSR 文件输入一个名称,在 Where(位置)中选择位置,然后选择 Save(保存)。

    为证书选择一个文件名

    此操作会将 CSR 文件保存到选定位置。 默认位置为桌面。 请记住为此文件选择的位置。

接下来,向 Apple 注册应用,启用推送通知并上传导出的 CSR,以便创建推送证书。

为推送通知注册应用程序

若要将推送通知发送到 iOS 应用,请向 Apple 注册应用程序,还要注册推送通知。

  1. 如果尚未注册应用,请浏览到 Apple 开发人员中心的 iOS 预配门户。 使用你的 Apple ID 登录到门户,然后选择标识符。 然后选择 + 注册新应用。

    iOS 预配门户应用 ID 页

  2. 在“注册新的标识符”页面上,选择“App ID”单选按钮。 然后选择“继续”。

    iOS 预配门户“注册新 ID”页

  3. 更新新应用的以下三个值,然后选择“Continue”(继续):

    • 说明:键入应用的描述性名称。

    • 捆绑 ID:按应用分发指南中所述,输入格式为 Organization Identifier.Product Name 的捆绑 ID。 “Organization Identifier”(组织标识符)和“Product Name”(产品名称)值必须与创建 Xcode 项目时使用的组织标识符与产品名称匹配。 在下面的屏幕截图中,NotificationHubs 值用作组织标识符,GetStarted 值用作产品名称。 确保 包标识符值与您的 Xcode 项目中的值匹配,以便 Xcode 可以使用正确的发布配置文件。

      iOS 预配门户“注册应用 ID”页

    • 推送通知:在“Capabilities”(功能)部分选中“Push Notifications”(推送通知)选项 。

      用于注册新应用 ID 的窗体

      此操作会生成应用 ID 并请求你确认信息。 选择“Continue”(继续),然后选择“Register”(注册) 以确认新的应用 ID。

      确认新的应用 ID

      选择“Register”(注册)后,新的应用 ID 将作为行项出现在“Certificates, Identifiers & Profiles”(证书、标识符和配置文件)页中。

  4. 在“Certificates, Identifiers & Profiles”(证书、标识符和配置文件)页的“Identifiers”(标识符)下,找到你刚刚创建的应用 ID 行项,并选择其所在的行以显示“Edit your App ID Configuration”(编辑应用 ID 配置)屏幕。

为通知中心创建证书

必须有证书才能使通知中心与 APNS 配合工作。 这可以通过以下两种方式之一完成:

  1. 创建可以直接上传到通知中心的 .p12 。
  2. 创建可用于基于令牌的身份验证的 .p8 (较新的方法 )。

基于令牌 (HTTP/2) 的 APNS 身份验证中所述,较新的方法(与使用证书相比)有很多好处。 不过,下面为这两种方法都提供了步骤。

选项 1:创建可以直接上传到通知中心的 .p12 推送证书

  1. 向下滚动到选中的“Push Notifications”(推送通知) 选项,然后选择“Configure”(配置) 以创建证书。

    编辑应用 ID 页

  2. 此时将显示“Apple Push Notification service SSL Certificates”(Apple 推送通知服务 SSL 证书) 窗口。 选择“Development SSL Certificate”(开发 SSL 证书) 部分下的“Create Certificate”(创建证书) 按钮。

    “为应用 ID 创建证书”按钮

    此时将显示“Create a new Certificate”(创建新证书) 屏幕。

    注释

    本教程使用开发证书。 注册生产证书时使用相同的过程。 只需确保在发送通知时使用相同的证书类型。

  3. 选择“Choose File”(选择文件),浏览到在第一个任务中保存 CSR 文件的位置,然后双击证书名以加载该证书。 然后选择“继续”。

  4. 当门户创建证书后,请选择“Download”(下载)按钮。 保存证书,并记住保存证书的位置。

    已生成证书的下载页

    这将下载证书并将其保存到计算机的 Downloads 文件夹。

    在 Downloads 文件夹中找到证书文件

    注释

    默认情况下,下载的开发证书名为 aps_development.cer

  5. 双击下载的推送证书 aps_development.cer。 此操作将在密钥链中安装新证书,如下图所示:

    Keychain Access 中的证书列表显示了新的证书

    注释

    证书中的名称可能会不同,但会以 Apple Development iOS Push Services 作为前缀。

  6. 在 Keychain Access 中,右键单击在“Certificates”(证书)类别中创建的新推送证书。 选择“Export”(导出),为文件命名,选择“.p12”格式,并选择“Save”(保存)。

    将证书作为 p12 格式导出

    可以选择使用密码保护证书,但这是可选的。 如果要跳过密码创建,请单击“OK”(确定) 。 记下导出的 .p12 证书的文件名和位置。 它们用于启用 APNs 身份验证。

    注释

    你的 .p12 文件名和位置可能不同于本教程中所示的名称和位置。

选项 2:创建可用于基于令牌的身份验证的 .p8 证书

  1. 请记下以下详细信息:

    • 应用 ID 前缀 (这是 团队 ID
    • 捆绑包 ID
  2. 返回到“证书、标识符和配置文件”,单击“密钥”

    注释

    如果已为 APNS 配置了密钥,则可以重复使用在创建后立即下载的 .p8 证书。 如果是这样,则可以忽略步骤 3 到步骤 5 。

  3. 单击 + 按钮(或“创建密钥”按钮)以创建新密钥。

  4. 提供合适的“密钥名称” 值,选中“Apple 推送通知服务(APNs)” 选项,然后单击“继续” ,接下来在下一个屏幕上单击“注册” 。

  5. 单击“下载” ,然后将 .p8 文件(前缀为 AuthKey_ )移动到安全的本地目录,然后单击“完成” 。

    注释

    请确保将 .p8 文件保存在安全的地方(并保存备份)。 密钥在下载后无法重新下载,因为服务器副本已删除。

  6. 在“密钥”上,单击您刚创建的密钥(或者,如果您选择使用现有密钥,则单击现有密钥)。

  7. 记下“密钥 ID”值。

  8. 在所选的合适应用程序(如 Visual Studio Code)中打开 .p8 证书,然后记下密钥值。 这是“-----BEGIN PRIVATE KEY-----” 和“-----END PRIVATE KEY-----” 之间的值。

    -----BEGIN PRIVATE KEY-----
    <key_value>
    -----END PRIVATE KEY-----
    

    注释

    这是稍后将用于配置通知中心的令牌值 。

完成这些步骤后,你应具有稍后要在使用 APNs 信息配置通知中心中使用的以下信息:

  • 团队 ID (请参阅步骤 1)
  • 捆绑包 ID (请参阅步骤 1)
  • 密钥 ID (请参阅步骤 7)
  • 令牌值 ,即 .p8 密钥值(请参阅步骤 8)

为应用程序创建配置文件

  1. 返回到 iOS 预配门户,选择“Certificates, Identifiers & Profiles”(证书、标识符和配置文件),从左侧菜单中选择“Profiles”(配置文件),然后选择 + 创建新的配置文件。 此时将显示“Register a New Provisioning Profile”(注册新的预配配置文件) 屏幕。

  2. 选择“Development”(开发)下的“iOS App Development”(iOS 应用程序开发)作为预配配置文件类型,然后选择“Continue”(继续)。

    配置文件列表

  3. 接下来,从“App ID”(应用 ID)下拉列表中选择创建的应用 ID,然后选择“Continue”(继续)。

    选择应用 ID

  4. 在“Select certificates”(选择证书)窗口中,选择用于代码签名的开发证书,然后选择“Continue”(继续)。 此证书并不是您所创建的推送证书。 如果不存在,则必须创建一个。 如果证书存在,请跳到下一步。 若要创建开发证书(如果开发证书不存在),请执行以下操作:

    1. 如果看到“No Certificates are available”(没有可用的证书) ,请选择“Create Certificate”(创建证书) 。
    2. 在“Software”(软件) 部分中,选择“Apple Development”(Apple 开发) 。 然后选择“继续”。
    3. 在“Create a new Certificate”(创建新证书) 屏幕中,选择“Choose File”(选择文件) 。
    4. 浏览到之前创建的“Certificate Signing Request”(证书签名请求) 证书,选择该证书,然后选择“Open”(打开) 。
    5. 选择继续
    6. 下载开发证书,并记住其保存位置。
  5. 返回到“Certificates, Identifiers & Profiles”(证书、标识符和配置文件)页,从左侧菜单中选择“Profiles”(配置文件),然后选择 + 创建新的配置文件。 此时将显示“Register a New Provisioning Profile”(注册新的预配配置文件) 屏幕。

  6. 在“Select certificates”(选择证书)窗口中,选择你刚刚创建的开发证书。 然后选择“继续”。

  7. 接下来,选择用于测试的设备,然后选择“Continue”(继续)。

  8. 最后,在Provisioning Profile Name中为配置文件选择一个名称,然后选择Generate

    选择预配配置文件名称

  9. 创建了新的预配配置文件后,选择“Download”(下载) 。 记住保存的位置。

  10. 浏览到预配配置文件所在的位置,然后双击该配置文件以将其安装在 Xcode 开发计算机上。

创建通知中心

在本部分将创建一个通知中心,并使用 .p12 推送证书或基于令牌的身份验证来配置 APNs 身份验证。 如果想要使用已创建的通知中心,可以跳到步骤 5。

  1. 登录到 Azure 门户

  2. 在左侧菜单上选择“所有服务” ,然后在“移动”部分中选择“通知中心”。 选择服务名称旁边的星形图标,以便将服务添加到左侧菜单上的“收藏夹”部分。 在将通知中心添加到收藏夹之后,在左侧菜单上选择它。

    Azure 门户 - 选择通知中心

  3. 在“通知中心” 页面上,在工具栏上选择“添加” 。

    通知中心 - 添加工具栏按钮

  4. “通知中心 ”页上,执行以下步骤:

    1. 通知中心中输入一个名称。

    2. 在“创建新的命名空间”中输入名称。 命名空间包含一个或多个中心。

    3. 位置下拉列表框中选择值。 此值指定要在其中创建集线器的位置。

    4. 选择 资源组中的现有资源组,或为新资源组创建名称。

    5. 选择 创建

      Azure 门户 - 设置通知中心属性

  5. 选择“通知”(钟形图标),然后选择“转到资源” 。 还可以刷新通知中心页上的列表,然后选择你的中心。

    Azure 门户 - 通知 -> 转到资源

  6. 从列表中选择“访问策略” 。 请注意,有两个可用的连接字符串。 稍后在处理推送通知时需要它们。

    重要

    不要在应用程序中使用 DefaultFullSharedAccessSignature 策略。 这仅适用于您的后端。

    Azure 门户 - 通知中心连接字符串

使用 APNs 信息配置通知中心

在“Notification Services” 下,选择“Apple (APNS)” ,然后根据以前在为通知中心创建证书部分中选择的方法,执行相应的步骤。

注释

仅当想要向从应用商店购买应用的用户发送推送通知时,才使用应用程序模式的生产模式。

选项 1:使用 .p12 推送证书

  1. 选择“证书”。

  2. 选择文件图标。

  3. 选择前面导出的 .p12 文件,然后选择“Open”(打开) 。

  4. 如果需要,请指定正确的密码。

  5. Select Sandbox mode.

    在 Azure 门户中配置 APNs 证书

  6. 选择“保存”

选项 2:使用基于令牌的身份验证

  1. 选择“令牌”。

  2. 输入前面获取的以下值:

    • 密钥 ID
    • 捆绑包 ID
    • 团队 ID
    • 令 牌
  3. 选择“沙盒”

  4. 选择“保存”

现在已使用 APNs 配置通知中心。 此外还有了用于注册应用和发送推送通知的连接字符串。

为 APNS 配置通知中心

  1. 在 Mac 上,启动 密钥链访问。 在左侧导航栏的 类别下,打开“我的证书”。 找到在上一部分下载的 SSL 证书,然后披露其内容。 仅选择证书(不选择私钥)。 然后 进行导出
  2. Azure 门户中,选择“”浏览所有>应用服务。 然后选择移动应用后端。
  3. 设置中,选择 应用服务推送。 然后选择通知中心名称。
  4. 转到 Apple Push Notification Services>上传证书。 上传 .p12 文件,选择正确的 模式(具体取决于先前的客户端 SSL 证书是生产证书还是沙盒证书)。 保存任何更改。

服务现已配置为在 iOS 上使用推送通知。

接下来,将在 Xamarin Studio 或 Visual Studio 中配置 iOS 项目设置。

在 Xamarin Studio 中配置 iOS 项目

  1. 在 Xamarin.Studio 中,打开 Info.plist,使用先前通过新应用 ID 创建的 包 ID 更新捆绑标识符。

  2. 向下滚动到 后台模式。 选择“ 启用后台模式 ”框和 “远程通知 ”框。

  3. 双击解决方案面板中的项目以打开 项目选项

  4. “构建”下,选择 “iOS 捆绑签名”,然后选择刚刚为此项目设置的相应标识和预配配置文件。

    这可确保项目使用新的签名资料进行代码签名。 有关官方 Xamarin 设备预配文档,请参阅 Xamarin 设备预配

在 Visual Studio 中配置 iOS 项目

  1. 在 Visual Studio 中,右键单击项目,然后单击“ 属性”。

  2. 在属性页中,单击 “iOS 应用程序 ”选项卡,并使用之前创建的 ID 更新 标识符

  3. iOS 捆绑签名选项卡中,选择刚刚为此项目设置的相应标识和配置文件。

    这可确保项目使用新配置文件进行代码签名。 有关官方 Xamarin 设备预配文档,请参阅 Xamarin 设备预配

  4. 双击 Info.plist 将其打开,然后在后台模式下启用 RemoteNotification

向 iOS 应用添加推送通知

  1. iOS 项目中,打开AppDelegate.cs,并将以下语句添加到代码文件的顶部。

    using Newtonsoft.Json.Linq;
    
  2. AppDelegate 类中,添加 RegisteredForRemoteNotifications 事件的重写代码来注册通知:

    public override void RegisteredForRemoteNotifications(UIApplication application,
        NSData deviceToken)
    {
        const string templateBodyAPNS = "{\"aps\":{\"alert\":\"$(messageParam)\"}}";
    
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
            {
                {"body", templateBodyAPNS}
            };
    
        // Register for push with your mobile app
        Push push = TodoItemManager.DefaultManager.CurrentClient.GetPush();
        push.RegisterAsync(deviceToken, templates);
    }
    
  3. AppDelegate 中,还为 DidReceiveRemoteNotification 事件处理程序添加以下替代:

    public override void DidReceiveRemoteNotification(UIApplication application,
        NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
    {
        NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;
    
        string alert = string.Empty;
        if (aps.ContainsKey(new NSString("alert")))
            alert = (aps[new NSString("alert")] as NSString).ToString();
    
        //show alert
        if (!string.IsNullOrEmpty(alert))
        {
            UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null);
            avAlert.Show();
        }
    }
    

    此方法在应用运行时处理传入通知。

  4. AppDelegate 类中,将以下代码添加到 FinishedLaunching 方法:

    // Register for push notifications.
    var settings = UIUserNotificationSettings.GetSettingsForTypes(
        UIUserNotificationType.Alert
        | UIUserNotificationType.Badge
        | UIUserNotificationType.Sound,
        new NSSet());
    
    UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
    UIApplication.SharedApplication.RegisterForRemoteNotifications();
    

    这项功能支持远程通知,并要求进行推送注册。

应用现已更新以支持推送通知。

在 iOS 应用中测试推送通知

  1. 右键单击 iOS 项目,然后单击“ 设置为启动项目”。

  2. 在 Visual Studio 中按 “运行 ”按钮或 F5 生成项目,并在 iOS 设备中启动应用。 然后单击“ 确定 ”接受推送通知。

    注释

    必须显式接受来自应用的推送通知。 此请求仅在应用首次运行时发生。

  3. 在应用中,键入任务,然后单击加号(+)图标。

  4. 验证是否收到通知,然后单击“ 确定 ”以消除通知。

配置和运行 Windows 项目(可选)

本部分用于运行适用于 Windows 设备的 Xamarin.Forms WinApp 和 WinPhone81 项目。 这些步骤还支持通用 Windows 平台 (UWP) 项目。 如果不使用 Windows 设备,可以跳过本部分。

将您的 Windows 应用注册到 Windows 通知服务 (WNS) 以接收推送消息

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

    将应用与 Windows 应用商店关联

  2. 在向导中,选择“下一步”。 然后使用Microsoft帐户登录。 在 保留新应用名称中,键入应用的名称,然后选择 保留

  3. 成功创建应用注册后,选择新的应用名称。 选择 下一步,然后选择 关联。 此过程将所需的 Windows 应用商店注册信息添加到应用程序清单。

  4. 使用以前为 Windows 应用商店应用创建的相同注册,对 Windows Phone 应用商店应用项目重复步骤 1 和步骤 3。

  5. 转到 Windows 开发者中心,然后使用 Microsoft 帐户登录。 在 “我的应用”中,选择新的应用注册。 然后展开 服务>推送通知

  6. 推送通知 页上,在 Windows 推送通知服务(WNS)和Microsoft Azure 移动应用下,选择 Live Services 站点。 记下 程序包 SID的值,以及应用程序机密中的当前值。

    开发人员中心应用设置

    重要

    应用程序机密和程序包 SID 是重要的安全凭据。 不要与任何人共享这些值,也不会与应用分发这些值。

为 WNS 配置通知中心

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

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

    在门户中设置 WNS 密钥

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

将推送通知添加到 Windows 应用

  1. 在 Visual Studio 中,在 Windows 项目中打开 App.xaml.cs ,并添加以下语句。

    using Newtonsoft.Json.Linq;
    using Microsoft.WindowsAzure.MobileServices;
    using System.Threading.Tasks;
    using Windows.Networking.PushNotifications;
    using <your_TodoItemManager_portable_class_namespace>;
    

    <your_TodoItemManager_portable_class_namespace> 替换为包含 TodoItemManager 类的可移植项目的命名空间。

  2. 在App.xaml.cs中,添加以下 InitNotificationsAsync 方法:

    private async Task InitNotificationsAsync()
    {
        var channel = await PushNotificationChannelManager
            .CreatePushNotificationChannelForApplicationAsync();
    
        const string templateBodyWNS =
            "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(messageParam)</text></binding></visual></toast>";
    
        JObject headers = new JObject();
        headers["X-WNS-Type"] = "wns/toast";
    
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
        {
            {"body", templateBodyWNS},
            {"headers", headers} // Needed for WNS.
        };
    
        await TodoItemManager.DefaultManager.CurrentClient.GetPush()
            .RegisterAsync(channel.Uri, templates);
    }
    

    此方法获取推送通知通道,并注册模板以从通知中心接收模板通知。 支持 messageParam 的模板通知将传送到此客户端。

  3. 在App.xaml.cs中,通过添加async修饰符更新 OnLaunched 事件处理程序方法定义。 然后在方法末尾添加以下代码行:

    await InitNotificationsAsync();
    

    这可确保每次启动应用时都会创建或刷新推送通知注册。 请务必执行此作,以确保 WNS 推送通道始终处于活动状态。

  4. 在 Visual Studio 解决方案资源管理器中,打开 Package.appxmanifest 文件,并在“通知”下将 Toast 支持设置为“是”。

  5. 生成应用并验证没有错误。 客户端应用现在应从移动应用后端注册模板通知。 对解决方案中的每个 Windows 项目重复本部分。

在 Windows 应用中测试推送通知

  1. 在 Visual Studio 中,右键单击 Windows 项目,然后单击“ 设置为启动项目”。
  2. “运行 ”按钮生成项目并启动应用。
  3. 在应用中,键入新 todoitem 的名称,然后单击加号图标+添加它。
  4. 验证是否在添加项目时收到通知。

后续步骤

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

还可以继续学习以下教程之一:

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