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

在本教程中,你将使用 Azure 通知中心向 iOS 应用程序推送通知。 你将创建一个空白 iOS 应用,它使用 Apple Push Notification 服务 (APNs) 接收推送通知。

在本教程中,你将执行以下步骤:

  • 生成证书签名请求文件
  • 请求你的应用推送通知
  • 为应用程序创建配置文件
  • 针对 iOS 推送通知配置通知中心
  • 将 iOS 应用连接到通知中心
  • 发送测试推送通知
  • 验证应用可以接收通知

可以 在 GitHub 上找到本教程的已完成代码。

先决条件

  • 有效的 Azure 帐户。 如果没有帐户,可以创建一个试用帐户,只需几分钟即可完成。
  • Azure Messaging Framework
  • 最新版本的 Xcode
  • 支持 iOS 10(或更高版本)的设备
  • Apple 开发人员计划 成员身份。

    Note

    由于推送通知的配置要求,必须在物理 iOS 的设备(iPhone 或 iPad)而不是在 iOS 模拟器上部署和测试推送通知。

完成本教程是学习有关 iOS 应用的所有其他通知中心教程的先决条件。

生成证书签名请求文件

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

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

  1. 在 Mac 上,运行 Keychain Access 工具。 可以从启动板上的“Utilities”或“Other”文件夹中打开该工具。
  2. 单击“Keychain Access”,展开“Certificate Assistant”(证书助理),并单击“Request a Certificate from a Certificate Authority...”(从证书颁发机构请求证书...)。

  3. 选择“用户电子邮件地址”和“公用名称”,确保已选择“保存到磁盘”,并单击“继续”。 将“CA Email Address”(CA 电子邮件地址)字段保留空白,因为它不是必填字段。

  4. 在“Save As”(另存为)中为证书签名请求 (CSR) 文件键入一个名称,在“Where”(位置)中选择一个位置,并单击“Save”(保存)。

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

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

为推送通知注册应用程序

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

  1. 如果尚未注册应用程序,请导航到 Apple 开发人员中心的 iOS 设置门户,使用 Apple ID 登录,单击“Identifiers”(标识符),然后单击“App IDs”(应用 ID),最后单击“+”号注册新的应用。

  2. 更新新应用的以下三个字段,并单击“Continue”(继续):

    • Name(名称):在“App ID Description”(应用 ID 说明)部分的“Name”(名称)字段中为应用键入一个描述性名称。
    • Bundle Identifier(捆绑标识符):在“Explicit App ID”(显式应用 ID)部分下,使用应用分发指南中所述的 <Organization Identifier>.<Product Name> 格式输入“Bundle Identifier”(捆绑标识符)。 使用的“Organization Identifier”(组织标识符)和“Product Name”(产品名称)必须与在创建 XCode 项目时使用的组织标识符与产品名称匹配。 在下面的屏幕截图中,NotificationHubs 用作组织标识符,GetStarted 用作产品名称。 如果确保此值与在 XCode 项目中使用的值匹配,则就可以在 XCode 中使用正确的发布配置文件。
    • 推送通知:在“应用服务”部分选中“推送通知”选项。

      此操作会生成应用 ID 并请求你确认信息。 单击“Register”(注册)确认新的应用 ID。

      单击“注册”后,会看到“注册已完成”屏幕,如下图所示。 单击“Done”(完成) 。

  3. 在开发人员中心的“App IDs”(应用 ID)下,找到创建的应用 ID,然后单击其所在行。

    单击应用 ID 会显示应用详细信息。 单击底部的“Edit”(编辑)按钮。

  4. 滚动到屏幕底部并单击“Development Push SSL Certificate”(开发推送 SSL 证书 )部分下的“Create Certificate...”(创建证书...)按钮。

    将显示“Add iOS Certificate”(添加 iOS 证书)助手。

    Note

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

  5. 单击“Choose File”(选择文件),浏览到在第一个任务中创建的 CSR 文件的保存位置,然后单击“Generate”(生成)。

  6. 门户创建证书之后,单击“Download”(下载)按钮,然后单击“Done”(完成)。

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

    Note

    默认情况下,下载的文件(开发证书)名为 aps_development.cer。

  7. 双击下载的推送证书 aps_development.cer

    此操作将在密钥链中安装新证书,如下图所示:

    Note

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

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

    记下导出的 .p12 证书的文件名和位置。 它用于启用 APNS 身份验证。

    Note

    本教程创建 QuickStart.p12 文件。 文件名和位置可能不同。

为应用程序创建配置文件

  1. 返回 iOS 预配门户,选择“Provisioning Profiles”(预配配置文件),选择“All”(全部),并单击 + 按钮创建一个新的配置文件。 将显示“添加 iOS 预配配置文件”向导

  2. 选择“开发”下的“iOS 应用程序开发”作为预配配置文件类型,并单击“继续”。
  3. 接下来,从“App ID”(应用 ID)下拉列表中选择创建的应用 ID,并单击“Continue”(继续)

  4. 在“Select certificates”(选择证书)屏幕中,选择经常用于代码签名的开发证书,然后单击“Continue”(继续)。 此证书不是所创建的推送证书。

  5. 接下来,选择要用于测试的“Devices”(设备),并单击“Continue”(继续)。

  6. 最后,在“Profile Name”(配置文件名称)中为配置文件选取一个名称,并单击“Generate”(生成)。

  7. 创建新的预配配置文件后,请单击下载该文件,并将其安装在 Xcode 开发计算机上。 然后单击“完成”。

针对 iOS 推送通知配置通知中心

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

  1. 登录到 Azure 门户

  2. 选择“创建资源” > “移动” > “通知中心”。

    Azure 门户 - 创建通知中心

  3. 在“通知中心”框中,键入一个唯一名称。 选择“区域”、“订阅”和“资源组”(如果已经有一个)。

    如果尚无服务总线命名空间,可以使用基于中心名称创建的默认名称(如果该命名空间名称可用)。

    如果已有要在其中创建中心的服务总线命名空间,请执行以步骤

    a. 在“命名空间”区域中,选择“选择现有”链接。

    b. 选择“创建” 。

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

  4. 选择“通知”(钟形图标),然后选择“转到资源”。

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

  5. 从列表中选择“访问策略”。 记下向你提供的两个连接字符串。 稍后在处理推送通知时需要它们。

    Important

    在应用程序中使用 DefaultFullSharedAccessSignature。 这只能在后端使用。

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

使用 APNS 信息配置通知中心

  1. 在“通知服务”下选择“Apple (APNS)”。
  2. 选择“证书”。
  3. 选择文件图标
  4. 选择前面导出的 .p12 文件。
  5. 指定正确的密码
  6. 选择“沙盒”模式。 仅当想要将推送通知发送给从应用商店购买你应用的用户时,才使用“生产”模式。

    在 Azure 门户中配置 APNS 证书

现在已为通知中心配置 APNS,并且有了用于注册应用和发送推送通知的连接字符串。

将 iOS 应用连接到通知中心

  1. 在 Xcode 中,创建新的 iOS 项目,然后选择“单视图应用程序”模板。

    Xcode — 单一视图应用程序

  2. 设置新项目的选项时,请务必使用在 Apple 开发人员门户中设置捆绑标识符时使用的同一产品名称组织标识符

    Xcode — 项目选项

  3. 在“项目导航器”下单击项目名称,然后单击“常规”选项卡,找到“签名”。 确保为 Apple 开发人员帐户选择适当的团队。 XCode 会根据捆绑标识符自动下拉以前创建的预配配置文件。

    如果屏幕未显示在 Xcode 中创建的新预配配置文件,请尝试刷新签名标识的配置文件。 单击菜单栏上的“Xcode”,再依次单击“首选项”、“帐户”选项卡、“查看详细信息”按钮、你的签名标识,然后单击右下角的刷新按钮。

    Xcode — 预配配置文件

  4. 选择“功能”选项卡,确保启用“推送通知”

    Xcode - 推送功能

  5. 下载 Azure Messaging Framework,然后解压缩该文件。 在 Xcode 中,右键单击项目,然后单击“将文件添加到”选项,将 WindowsAzureMessaging.framework 文件夹添加到 Xcode 项目。 选择“选项”,确保选中“根据需要复制项目”,然后单击“添加”。

    解压缩 Azure SDK

  6. 将新的标头文件添加到名为 HubInfo.h 的项目。 此文件保存着通知中心的常量。 添加以下定义,然后将字符串文本占位符替换为中心名称以及前面记下的 DefaultListenSharedAccessSignature

        #ifndef HubInfo_h
        #define HubInfo_h
    
            #define HUBNAME @"<Enter the name of your hub>"
            #define HUBLISTENACCESS @"<Enter your DefaultListenSharedAccess connection string"
    
        #endif /* HubInfo_h */
    
  7. 打开 AppDelegate.h 文件并添加以下导入指令:

        #import <WindowsAzureMessaging/WindowsAzureMessaging.h>
        #import <UserNotifications/UserNotifications.h> 
        #import "HubInfo.h"
    
  8. AppDelegate.m 文件的 didFinishLaunchingWithOptions 方法中添加以下代码,具体取决于 iOS 版本。 此代码向 APNs 注册设备句柄:

        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound |
            UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
    
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    
  9. 在同一文件中添加以下方法:

         - (void) application:(UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *) deviceToken {
           SBNotificationHub* hub = [[SBNotificationHub alloc] initWithConnectionString:HUBLISTENACCESS
                                        notificationHubPath:HUBNAME];
    
            [hub registerNativeWithDeviceToken:deviceToken tags:nil completion:^(NSError* error) {
               if (error != nil) {
                   NSLog(@"Error registering for notifications: %@", error);
                }
                else {
                   [self MessageBox:@"Registration Status" message:@"Registered"];
              }
          }];
         }
    
        -(void)MessageBox:(NSString *) title message:(NSString *)messageText
        {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:messageText delegate:self
                cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
        }
    

    此代码将使用在 HubInfo.h 中指定的连接信息连接到通知中心。 然后,它向通知中心提供设备令牌,使通知中心能够发送通知。

  10. 在同一文件中,添加以下方法以便在应用处于活动状态时收到通知的情况下显示 UIAlert

            - (void)application:(UIApplication *)application didReceiveRemoteNotification: (NSDictionary *)userInfo {
               NSLog(@"%@", userInfo);
               [self MessageBox:@"Notification" message:[[userInfo objectForKey:@"aps"] valueForKey:@"alert"]];
           }
    
  11. 若要验证是否没有故障,请在设备上生成并运行应用。

发送测试推送通知

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

Azure 门户 - 测试性发送

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

下面是你可能想要查看的有关发送通知的其他教程列表:

验证应用可以接收推送通知

要在 iOS 上测试推送通知,必须将应用部署到物理 iOS 设备。 不能使用 iOS 模拟器发送 Apple 推送通知。

  1. 运行应用并验证注册是否成功,然后按“确定”。

    iOS 应用推送通知注册测试

  2. 如上一部分所述,接下来可以从 Azure 门户发送测试推送通知。

  3. 该推送通知会从特定通知中心发送到所有已注册为接收通知的设备。

    iOS 应用推送通知接收测试

后续步骤

在这个简单的示例中,已将推送通知广播到所有已注册的 iOS 设备。 若要了解如何向特定的 iOS 设备推送通知,请转到以下教程: