通过 Azure 通知中心向 iOS 发送推送通知

概述

Note

若要完成本教程,你必须有一个有效的 Azure 帐户。如果你没有帐户,可以创建一个试用帐户,只需几分钟即可完成。有关详细信息,请参阅 Azure 1 元试用

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

完成后,你将能够使用通知中心将推送通知广播到运行你的应用的所有设备。

开始之前

本主题旨在帮助你尽快快速使用通知中心。本主题演示了一个极简单的广播方案,并将重点放在通知中心的基本概念上。

如果你已熟悉通知中心,可以从左侧导航栏中选择另一个主题,或参阅后续步骤中的相关链接。

我们非常重视你的反馈。如果你在完成本主题的过程中遇到任何难题,或者在改善内容方面有任何建议,请在页面底部提供反馈,我们将不胜感激。

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

先决条件

本教程需要的内容如下:

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

生成证书签名请求文件

Apple 推送通知服务 (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. 选择你的“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 登录,单击“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 中使用正确的发布配置文件。

    • Push Notifications(推送通知):在“App Services”(应用服务)部分中选中“Push Notifications”(推送通知)选项。

      此时将会生成你的应用 ID 并请求你确认信息。单击“注册”以确认新的应用 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

    将在 Keychain 中安装新证书,如下所示:

    Note

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

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

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

    Note

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

为应用程序创建配置文件

  1. 返回 iOS 设置门户,选择“Provisioning Profiles”(设置配置文件),选择“All”(全部),然后单击“+”按钮创建一个新的配置文件。此时会启动“Add iOS Provisiong Profile”(添加 iOS 设置配置文件)向导

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

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

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

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

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

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

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

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

  1. 登录到 Azure 门户,然后单击屏幕左上角的“+新建”。

  2. 单击“新建”,然后单击“Web + 移动”。根据需要向下滚动,然后单击“通知中心”。

    Azure 门户 - 创建通知中心

  3. 确保在“通知中心”字段中指定唯一的名称。选择所需的“区域”、“订阅”和“资源组”(如果已经有一个)。

    如果你已经有想在其中创建中心的服务总线命名空间,则通过“命名空间”字段中的“选择现有”选项来选择它。否则,可以使用根据中心名称创建的默认名称,前提是该命名空间名称可用。

    准备就绪后,单击“创建”。

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

  4. 创建命名空间和通知中心后,就将进入相应的门户页。

    Azure 门户 - 通知中心门户页面

  5. 单击“设置”和“访问策略”,记下都提供给你的两个连接字符串,随后将需要它们来处理推送通知。

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

  1. 单击“设置”边栏选项卡中的“通知服务”按钮,然后选择“Apple (APNS)”。单击“上载证书”,然后选择你先前导出的 .p12 文件。确保同时指定正确的密码。

    由于此项目用于开发,因此请务必选择“沙箱”模式。仅当你想要将推送通知发送给从应用商店购买你应用的用户时,才使用“生产”模式。

  在 Azure 门户中配置 APNS

  在 Azure 门户中配置 APNS 证书

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

将你的 iOS 应用连接到通知中心

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

    Xcode — 单一视图应用程序

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

    Xcode — 项目选项

  3. 在“目标”下,单击你的项目名称,单击“生成设置”选项卡,展开“代码签名标识”,然后在“调试”下设置你的代码签名标识。将“级别”从“基本”切换为“全部”,然后将“预配配置文件”设为前面创建的预配配置文件。

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

    Xcode — 预配配置文件

  4. 下载移动服务 iOS SDK 版本 1.2.4,然后将文件解压缩。在 Xcode 中,右键单击你的项目,然后单击“将文件添加到”选项,将 WindowsAzureMessaging.framework 文件夹添加到 Xcode 项目。选择“需要时复制项”,然后单击“添加”。

    Note

    通知中心 SDK 目前不支持 Xcode 7 上的 Bitcode。你必须在项目的“构建选项”中将“启用 Bitcode”设置为“否”。

    解压缩 Azure SDK

  5. 将新的标头文件添加到名为 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 */
    
  6. 打开 AppDelegate.h 文件并添加以下导入指令:

     #import <WindowsAzureMessaging/WindowsAzureMessaging.h> 
     #import "HubInfo.h"
    
  7. 根据 iOS 版本,在 AppDelegate.m filedidFinishLaunchingWithOptions 方法中添加以下代码。此代码将向 APNs 注册设备句柄:

    对于 iOS 8:

     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound |
                                            UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
    
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    

    对于 iOS 8 之前的版本:

     [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    
  8. 在同一文件中,添加以下方法。此代码将使用你在 HubInfo.h 中指定的连接信息连接到通知中心。然后,它向通知中心提供设备令牌,使通知中心能够发送通知:

    - (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];
    }
    
  9. 在同一文件中,添加以下方法以便在应用处于活动状态时收到通知的情况下显示 UIAlert

    - (void)application:(UIApplication *)application didReceiveRemoteNotification: (NSDictionary *)userInfo {
        NSLog(@"%@", userInfo);
        [self MessageBox:@"Notification" message:[[userInfo objectForKey:@"aps"] valueForKey:@"alert"]];
    }
    
  10. 在设备上生成并运行应用,以验证是否不会失败。

发送测试推送通知

可以在 Azure 门户中通过中心边栏选项卡中的“故障排除”部分(使用“测试发送”选项)发送推送通知,以便测试应用的通知接收功能。

Azure 门户 — 测试发送

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

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

  • Azure 移动服务:有关如何从通知中心集成的 Azure 移动服务后端发送通知的示例,请参阅 [移动服务中的推送通知入门]。
  • ASP.NET:[使用通知中心将通知推送到用户]。
  • Azure 通知中心 Java SDK:有关从 Java 发送通知的信息,请参阅如何通过 Java 使用通知中心。这种方法已在 Eclipse for Android 开发环境中进行测试。
  • PHP:如何通过 PHP 使用通知中心

在本教程的下一部分中,你将了解如何使用通知中心 REST 接口直接在应用程序中发送通知消息。所有已注册的设备将接收任何设备发送的通知。

(可选)从应用发送推送通知

Important

提供这个从客户端应用发送通知查询的示例仅供学习。由于这需要将 DefaultFullSharedAccessSignature 呈现在客户端应用中,这使您的通知中心面临这样的风险:即用户可能会获得相应访问权限将未经授权的通知发送到您的客户端。

如果你要从应用内发送推送通知,本节提供如何使用 REST 接口执行此操作的示例。

  1. 在 Xcode 中,打开 Main.storyboard 并从对象库添加以下 UI 组件,以允许用户在应用中发送推送通知:

    • 没有标签文本的标签。该标签用于报告发送通知时发生的错误。Lines 属性应该设为 0,以便自动根据左右边距和视图顶部的限制来调整大小。
    • 具有占位符文本的文本字段设为“输入通知消息”。将字段限制在标签的正下方,如下所示。将视图控制器设为容器委派。
    • 标题为“发送通知”的按钮限制在文本字段的正下方,并在水平居中的位置。

      该视图应如下所示:

      Xcode 设计器

  2. 为与视图连接的标签和文本字段添加容器,并更新 interface 定义,以支持 UITextFieldDelegateNSXMLParserDelegate。添加如下所示的三个属性声明,以帮助调用 REST API 和分析响应。

    ViewController.h 文件应如下所示:

    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController <UITextFieldDelegate, NSXMLParserDelegate>
    {
        NSXMLParser *xmlParser;
    }
    
    // Make sure these outlets are connected to your UI by ctrl+dragging
    @property (weak, nonatomic) IBOutlet UITextField *notificationMessage;
    @property (weak, nonatomic) IBOutlet UILabel *sendResults;
    
    @property (copy, nonatomic) NSString *statusResult;
    @property (copy, nonatomic) NSString *currentElement;
    
    @end
    
  3. 打开 HubInfo.h 并添加以下常量,用于向中心发送通知。将占位符字符串文本替换为实际的 DefaultFullSharedAccessSignature 连接字符串。

    #define API_VERSION @"?api-version=2015-01"
    #define HUBFULLACCESS @"<Enter Your DefaultFullSharedAccess Connection string>"
    
  4. ViewController.h 文件添加以下 #import 语句。

    #import <CommonCrypto/CommonHMAC.h>
    #import "HubInfo.h"
    
  5. ViewController.m 中,将以下代码添加到接口实现。此代码将会分析你的 DefaultFullSharedAccessSignature 连接字符串。如 REST API 参考中所述,此类已分析的信息将用于生成 Authorization 请求标头的 SaS 令牌。

    NSString *HubEndpoint;
    NSString *HubSasKeyName;
    NSString *HubSasKeyValue;
    
    -(void)ParseConnectionString
    {
        NSArray *parts = [HUBFULLACCESS componentsSeparatedByString:@";"];
        NSString *part;
    
        if ([parts count] != 3)
        {
            NSException* parseException = [NSException exceptionWithName:@"ConnectionStringParseException"
                reason:@"Invalid full shared access connection string" userInfo:nil];
    
            @throw parseException;
        }
    
        for (part in parts)
        {
            if ([part hasPrefix:@"Endpoint"])
            {
                HubEndpoint = [NSString stringWithFormat:@"https%@",[part substringFromIndex:11]];
            }
            else if ([part hasPrefix:@"SharedAccessKeyName"])
            {
                HubSasKeyName = [part substringFromIndex:20];
            }
            else if ([part hasPrefix:@"SharedAccessKey"])
            {
                HubSasKeyValue = [part substringFromIndex:16];
            }
        }
    }
    
  6. ViewController.m 中更新 viewDidLoad 方法,以便在加载视图时解析连接字符串。此外,将如下所示的实用程序方法添加到接口实现。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self ParseConnectionString];
        [_notificationMessage setDelegate:self];
    }
    
    -(NSString *)CF_URLEncodedString:(NSString *)inputString
    {
       return (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)inputString,
            NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
    }
    
    -(void)MessageBox:(NSString *)title message:(NSString *)messageText
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:messageText delegate:self
            cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
    }
    
  7. REST API 参考中所述,在 ViewController.m 中,将以下代码添加到接口实现,以生成将在 Authorization 标头中提供的 SaS 授权令牌。

    -(NSString*) generateSasToken:(NSString*)uri
    {
        NSString *targetUri;
        NSString* utf8LowercasedUri = NULL;
        NSString *signature = NULL;
        NSString *token = NULL;
    
        @try
        {
            // Add expiration
            uri = [uri lowercaseString];
            utf8LowercasedUri = [self CF_URLEncodedString:uri];
            targetUri = [utf8LowercasedUri lowercaseString];
            NSTimeInterval expiresOnDate = [[NSDate date] timeIntervalSince1970];
            int expiresInMins = 60; // 1 hour
            expiresOnDate += expiresInMins * 60;
            UInt64 expires = trunc(expiresOnDate);
            NSString* toSign = [NSString stringWithFormat:@"%@\n%qu", targetUri, expires];
    
            // Get an hmac_sha1 Mac instance and initialize with the signing key
            const char *cKey  = [HubSasKeyValue cStringUsingEncoding:NSUTF8StringEncoding];
            const char *cData = [toSign cStringUsingEncoding:NSUTF8StringEncoding];
            unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
            CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
            NSData *rawHmac = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
            signature = [self CF_URLEncodedString:[rawHmac base64EncodedStringWithOptions:0]];
    
            // Construct authorization token string
            token = [NSString stringWithFormat:@"SharedAccessSignature sig=%@&se=%qu&skn=%@&sr=%@",
                signature, expires, HubSasKeyName, targetUri];
        }
        @catch (NSException *exception)
        {
            [self MessageBox:@"Exception Generating SaS Token" message:[exception reason]];
        }
        @finally
        {
            if (utf8LowercasedUri != NULL)
                CFRelease((CFStringRef)utf8LowercasedUri);
            if (signature != NULL)
            CFRelease((CFStringRef)signature);
        }
    
        return token;
    }
    
  8. 按住 Ctrl 并从“发送通知”按钮拖到 ViewController.m,为 Touch Down 事件添加名为 SendNotificationMessage 的操作。使用以下代码更新方法,以使用 REST API 发送通知。

    - (IBAction)SendNotificationMessage:(id)sender
    {
        self.sendResults.text = @"";
        [self SendNotificationRESTAPI];
    }
    
    - (void)SendNotificationRESTAPI
    {
        NSURLSession* session = [NSURLSession
                         sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                         delegate:nil delegateQueue:nil];
    
        // Apple Notification format of the notification message
        NSString *json = [NSString stringWithFormat:@"{"aps":{"alert":"%@"}}",
                            self.notificationMessage.text];
    
        // Construct the message's REST endpoint
        NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@/messages/%@", HubEndpoint,
                                            HUBNAME, API_VERSION]];
    
        // Generate the token to be used in the authorization header
        NSString* authorizationToken = [self generateSasToken:[url absoluteString]];
    
        //Create the request to add the APNs notification message to the hub
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
        // Signify Apple notification format
        [request setValue:@"apple" forHTTPHeaderField:@"ServiceBusNotification-Format"];
    
        //Authenticate the notification message POST request with the SaS token
        [request setValue:authorizationToken forHTTPHeaderField:@"Authorization"];
    
        //Add the notification message body
        [request setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];
    
        // Send the REST request
        NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
        {
            NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
            if (error || (httpResponse.statusCode != 200 && httpResponse.statusCode != 201))
            {
                NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
            }
            if (data != NULL)
            {
                xmlParser = [[NSXMLParser alloc] initWithData:data];
                [xmlParser setDelegate:self];
                   [xmlParser parse];
            }
        }];
        [dataTask resume];
    }
    
  9. ViewController.m 中,添加以下委托方法,以支持关闭文本字段的键盘。按住 Ctrl 并从文本字段拖到接口设计器中的视图控制器图标,以将视图控制器设为容器委派。

    //===[ Implement UITextFieldDelegate methods ]===
    
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    
  10. ViewController.m 中添加以下委托方法,以支持使用 NSXMLParser 解析响应。

    //===[ Implement NSXMLParserDelegate methods ]===
    
    -(void)parserDidStartDocument:(NSXMLParser *)parser
    {
        self.statusResult = @"";
    }
    
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
        namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
        attributes:(NSDictionary *)attributeDict
    {
        NSString * element = [elementName lowercaseString];
        NSLog(@"*** New element parsed : %@ ***",element);
    
        if ([element isEqualToString:@"code"] | [element isEqualToString:@"detail"])
        {
            self.currentElement = element;
        }
    }
    
    -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)parsedString
    {
        self.statusResult = [self.statusResult stringByAppendingString:
            [NSString stringWithFormat:@"%@ : %@\n", self.currentElement, parsedString]];
    }
    
    -(void)parserDidEndDocument:(NSXMLParser *)parser
    {
        // Set the status label text on the UI thread
        dispatch_async(dispatch_get_main_queue(),
        ^{
            [self.sendResults setText:self.statusResult];
        });
    }
    
  11. 生成项目并确认没有错误。

Note

如果在 Xcode7 中遇到有关 bitcode 支持的生成错误,应该在 Xcode 中将“生成设置”>“启用 Bitcode (ENABLE_BITCODE)”更改为“否”。通知中心 SDK 目前不支持 Bitcode。

可以在 Apple 本地和推送通知编程指南中查看所有可能的通知负载。

检查你的应用能否接收推送通知

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

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

    iOS 应用推送通知注册测试

  2. 如上所述,可以从 Azure 门户发送测试推送通知。如果你在应用中添加了发送推送通知的代码,请触摸文本字段以输入通知消息。然后,按键盘上的“发送”按钮或视图中的“发送通知”按钮,以发送通知消息。

    iOS 应用推送通知发送测试

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

    iOS 应用推送通知接收测试

后续步骤

在这个简单的示例中,你已将推送通知广播到所有已注册的 iOS 设备。建议转到 Azure 通知中心 - 使用 .NET 后端通知 iOS 用户教程开始下一步的学习,该教程将引导你使用标记创建后端以发送推送通知。

如果要按兴趣组划分用户,可以进一步阅读使用通知中心发送突发新闻教程。

有关通知中心的常规信息,请参阅通知中心指南