教程:使用 Azure 通知中心向 Xamarin.iOS 应用发送推送通知

概述

本教程演示如何使用 Azure 通知中心将推送通知发送到 iOS 应用程序。 你将创建一个空白 Xamarin.iOS 应用,它使用 Apple Push Notification 服务 (APNs) 接收推送通知。

完成后,你将能够使用通知中心将推送通知广播到运行你的应用的所有设备。 NotificationHubs 应用示例中提供了完成的代码。

在本教程中,你创建/更新代码来执行以下任务:

  • 生成证书签名请求文件
  • 为推送通知注册应用程序
  • 为应用程序创建配置文件
  • 针对 iOS 推送通知配置通知中心
  • 发送测试推送通知

先决条件

只有在完成本教程后,才能完成有关 Xamarin iOS 应用的所有其他通知中心教程。

生成证书签名请求文件

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

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

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

  2. 选择 Keychain Access,展开 Certificate Assistant(证书助理),然后选择 Request a Certificate from a Certificate Authority(从证书颁发机构请求证书)。

    使用 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. 注册新的标识符屏幕上,选择应用 ID 单选按钮。 然后选择继续

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

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

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

    • 捆绑 ID:按应用分发指南中所述,输入格式为 Organization Identifier.Product Name 的捆绑 ID。 “Organization Identifier”(组织标识符)和“Product Name”(产品名称)值必须与创建 Xcode 项目时使用的组织标识符与产品名称匹配。 在下面的屏幕截图中,NotificationHubs 值用作组织标识符,GetStarted 值用作产品名称。 确保“Bundle Identifier”(捆绑标识符)值与 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. 在左侧菜单上选择“所有服务”,然后在“Web + 移动”部分选择“通知中心”。 选择服务名称旁边的星形图标,以便将服务添加到左侧菜单上的“收藏夹”部分。 在将“通知中心” 添加到“收藏夹” 之后,在左侧菜单上选择它。

    Azure 门户 - 选择“通知中心”

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

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

  4. 在“通知中心”页面上的“基本信息”选项卡中,执行以下步骤:

    1. 在“订阅”中,选择要使用的 Azure 订阅的名称,然后选择现有资源组或创建新资源组。

    2. 在“命名空间详细信息”中为新命名空间输入唯一名称。

    3. 命名空间包含一个或多个通知中心,因此请在“通知中心详细信息”中键入中心的名称。

    4. 从“位置”下拉列表框中选择值。 此值指定要在其中创建通知中心的位置。

    5. 选择创建

  5. 部署完成后,选择“转到资源”。

使用 APNs 信息配置通知中心

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

注意

如果使用 App Store 或即席分发配置文件构建应用,请使用“生产”作为“应用程序模式” 。 这将允许设备向从应用商店购买了应用的用户发送推送通知。

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

  1. 选择“证书”。

  2. 选择文件图标。

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

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

  5. 选择“沙盒” 模式。

    在 Azure 门户中配置 APNs 证书

  6. 选择“保存” 。

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

  1. 选择“令牌”。

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

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

  4. 选择“保存”。

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

将应用连接到通知中心

创建新项目

  1. 在 Visual Studio 中创建新的 iOS 项目并选择“单视图应用”模板,然后单击“下一步”

    Visual Studio - 选择应用程序类型

  2. 输入应用名称和组织标识符,然后单击“下一步”和“创建”。

  3. 在“解决方案”视图中双击“Info.plist”, 确保“标识”下 的捆绑标识符与创建预配配置文件时使用的相符。 在“签名”下,确保 选中开发人员帐户;在“团队”下,确保选中“自动管理签名”。这样就会自动选中签名证书和预配配置文件。

    Visual Studio- iOS 应用配置

  4. 在“解决方案”视图中双击 Entitlements.plist,确保选中“启用推送通知”。

    Visual Studio - iOS 授权配置

  5. 添加 Azure 消息传送包。 在“解决方案”视图中右键单击项目,然后选择“添加” > “添加 NuGet 包”。 搜索 Xamarin.Azure.NotificationHubs.iOS,向项目添加该包。

  6. 向类添加新文件,将其命名为 Constants.cs,然后添加以下变量,将字符串文本占位符替换为此前记下的 hubnameDefaultListenSharedAccessSignature

    // Azure app-specific connection string and hub path
    public const string ListenConnectionString = "<Azure DefaultListenSharedAccess Connection String>";
    public const string NotificationHubName = "<Azure Notification Hub Name>";
    
  7. AppDelegate.cs 中,添加以下 using 语句:

    using WindowsAzure.Messaging.NotificationHubs;
    using UserNotifications
    
  8. AppDelegate.cs 中创建 MSNotificationHubDelegate 的实现:

    public class AzureNotificationHubListener : MSNotificationHubDelegate
    {
        public override void DidReceivePushNotification(MSNotificationHub notificationHub, MSNotificationHubMessage message)
        {
    
        }
    }
    
  9. AppDelegate.cs 中更新 FinishedLaunching(),使之与以下代码匹配:

    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        // Set the Message listener
        MSNotificationHub.SetDelegate(new AzureNotificationHubListener());
    
        // Start the SDK
        MSNotificationHub.Start(ListenConnectionString, NotificationHubName);
    
        return true;
    }
    
  10. AppDelegate.cs 中,为 AzureNotificationHubListener 类实现 DidReceivePushNotification 方法:

    public override void DidReceivePushNotification(MSNotificationHub notificationHub, MSNotificationHubMessage message)
    {
        // This sample assumes { aps: { alert: { title: "Hello", body: "World" } } }
        var alertTitle = message.Title ?? "Notification";
        var alertBody = message.Body;
    
        var myAlert = UIAlertController.Create(alertTitle, alertBody, UIAlertControllerStyle.Alert);
        myAlert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
        UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(myAlert, true, null);
    }
    
  11. 在设备上运行应用程序。

发送测试推送通知

可以在 Azure 门户中使用“测试性发送”选项,在应用中测试通知的发送。 它会向设备发送测试性的推送通知。

Azure 门户 - 测试性发送

通常,推送通知是在后端服务(例如,移动应用,或者使用兼容库的 ASP.NET)中发送的。 如果后端没有可用库,也可使用 REST API 直接发送通知消息。

后续步骤

本教程介绍了如何将广播通知发送到所有注册到后端的 iOS 设备。 若要了解如何向特定的 iOS 设备推送通知,请转到以下教程: