`

向 iOS 设备发送推送通知(转)

 
阅读更多

转载自:http://www.ibm.com/developerworks/cn/mobile/mo-ios-push/

 

 

背景

SMS 和 MMS 消息是由无线运营商通过设备的电话号码向特定设备提供的。实现 SMS/MMS 的服务器端应用程序的开发人员必须费大量精力才能与现有的封闭电信基础架构进行交互(其中包括获取电话号码)。(阅读 "Build mobile messaging into your web apps",了解有关开发服务器端 SMS/MMS 应用程序的更多详细信息。)SMS/MMS 消息不能识别收件人设备上所安装的应用程序。

像 iPhone 和 Android 设备等超级智能手机(以及其 Wi-Fi 关联产品,如 iPod Touch 和 iPad)的普及带来了对现代化移动消息基础架构的需求,该基础架构可以直接向已安装的应用程序(而非电话号码)提供丰富的多媒体信息,并且它比 SMS/MMS 更加开放并且成本更低。

双向消息

SMS/MMS 基础架构的其中一个优秀特性是,服务器应用程序可以接收和响应 手机发送的消息。相反,推送消息是单向的:您只能从您的服务器向设备上的应用程序发送消息。但是,这不是一个主要问题。您不需要让用户 “发送文本 XYZ 到 12345 以接收信息”,您可以告诉他们 “下载应用程序 XYZ 来接收信息”。而应用程序本身可以在需要时直接上传内容到您的服务器,无需向服务器发送消息。

Apple 和 Google 均分别开发了基于 Internet 的基础架构,分别从服务器应用程序向 iOS 和 Android 设备提供消息,从而迎接挑战。推送 通知是一种全新设计,旨在与安装在移动设备上的应用程序进行通信。它们可以发送文本、多媒体文件和应用程序特定的数据,如警报声和显示在应用程序图标上的徽章。

本文介绍了推送通知技术如何在 iOS 平台上工作,以及如何将它融入您的应用程序。为了从本文得到最大收获,您应该具备一些 iOS 和 Java 开发经验。

iOS 推送基础知识

Apple 使用公共密钥数字证书对来自 iOS 应用程序的推送请求进行身份验证,所以您首先需要创建身份验证密钥,并向 Apple 注册它们。我将在下一节中花相当长的篇幅来直接介绍这一点。

接下来,需要确定安装该应用程序并选择接收该应用程序的推送通知的每台设备。工作顺序如下:

  1. iOS 应用程序中的一个警告对话框会请求用户的许可,以接收推送通知。
  2. 如果用户授予权限,iOS 应用程序会联系 Apple Push Notification 服务 (APNs) 获得一个 ID 字符串,以惟一地标识在此设备上安装的这个应用程序。(您可以将 ID 看作类似于传统消息场景中的收件人电话号码)。
  3. iOS 应用程序将 ID 上传到您的服务器应用程序。
  4. 当服务器应用程序需要发送推送消息时,它对 Apple 的推送服务器进行身份验证,然后使用从步骤 2 和 3 中获得的 ID 指定消息的收件人。
  5. 如果收件人设备在线,它接收并处理消息。如果设备离线,那么消息将会排队,然后当设备下一次在线时交付。

您自己服务器的一个替代方案:Urban Airship

Urban Airship 是一种服务,让您无需运行自己的服务器就可以推送消息(参见 参考资料)。将私钥上传到 Urban Airship 并使用其基于 Web 的消息控制台,以向用户推送消息。Urban Airship 提供了一个 iOS SDK,使您的应用程序可以很容易地将每个已安装的设备注册到其服务器,那么这些设备就会出现在消息控制台。虽然 Urban Airship 可以简化您的工作,但是成本昂贵,并且您还需要了解基本的推送通知概念。

APNs 也使您的服务器应用程序可以定期验证您所保存的应用程序 ID 列表。这使您有机会删除那些在后来删除应用程序或修改其推送选择状态的用户和 ID。

这听起来好像要涉及很多工作,的确是这样的。这就是为什么会存在像 Urban Airship 的服务,收费代理消息(见侧栏)。

在说明如何注册应用程序之后,我将进入开发 iOS 推送通知应用程序的细节,并利用开源 Java 库及其服务器组件的帮助。

注册应用程序

要注册您的应用程序使用推送通知,您首先需要创建一对私有/公共密钥,对 APNs 服务器的 API 调用进行身份验证。在 Mac 上,您可以通过使用 KeyChain Access 应用程序完成该操作。选择 KeyChain Access > Certificate Assistant > Request a Certificate from a Certificate Authority,以创建一个证书签名请求文件。该请求文件包含生成的公共密钥对,而相应的私钥则保存在 KeyChain Access 中。请务必在对话框中选择 Saved to disk 选项,如图 1 所示:


图 1. 在 Mac 上从 KeyChain Access 程序生成一个密钥对和签名请求
在 Mac 上从 KeyChain Access 程序生成一个密钥对和签名请求的屏幕截图 

接下来,登录到 Apple 的应用程序配置门户(参见 参考资料),并上传您的签名请求文件,它将被关联到相应的配置概要文件。大多数应用程序都有一个供测试人员使用的开发配置概要文件,以及一个用于 App Store 的生产概要文件,所以您将最有可能产生和上传两个签名请求。在您上传签名请求后,该门户生成一个数字证书,供您下载。该证书包含公钥,现在 APNs 识别为与您应用程序关联。图 2 显示了一个示例:


图 2. 来自 Apple 的数字证书
来自 Apple 的数字证书的屏幕截图 

下载数字证书,并双击要下载的文件。现在,KeyChain Access 自动导入数字证书,并将它与您在创建签名请求时生成的私钥关联起来。图 3 显示了在 KeyChain Access 中的公钥和私钥对:


图 3. 在 KeyChain Access 中的公钥和私钥对
在 KeyChain Access 中的公钥和私钥对的屏幕截图 

现在,将密钥对导出为一个文件,所使用的格式称为 Personal Information Exchange (p12)。当您创建 p12 文件时,KeyChain Access 要求您指定一个密码来保护私钥。如果您想使用一个空密码,也没有问题。

从这时起,所有对 APNs 推送服务器的 API 请求都必须由 p12 文件中​​的私钥进行加密,然后由该 p12 文件中的公钥进行数字签名,以验证 API 调用是真的由您生成的。稍后在本文中描述如何与 APNs 服务器交互时,我将演示如何使用密钥。(如果您使用 Urban Airship,它会要求您将 p12 文件以及任何密码上传到其服务器,以便它能够以您的名义发送推送消息。)

现在,您已经有了推送证书,您必须重新下载并重新安装您的应用程序配置概要文件,因为概要文件现在已被更新为可以支持应用程序的推送通知。

请求和保存设备令牌

您的 iOS 应用程序需要请求用户许可,在它所安装的设备上接收推送通知。通常情况下,您可以通过一个简单的 API 调用在应用程序代理中实现这一点,如清单 1 所示:


清单 1. 请求用户许可

				
[[UIApplication sharedApplication]
    registerForRemoteNotificationTypes:
        (UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeSound | 
         UIRemoteNotificationTypeAlert)];


如果用户授予许可,应用程序会自动联系 APNs 服务器获取设备令牌。令牌使 APNs 可以将该特定设备上所安装的这个特定应用程序识别为一个消息目的地。这个过程是自动的,并且在后台执行。您不需要为它编写任何代码。

在 APNs 服务器响应后,应用程序代理中的 didRegisterForRemoteNotificationsWithDeviceToken 方法被调用,并将设备令牌作为一个调用参数传递进来。您必须保存设备令牌并将它上传到自己的推送通知服务器,如清单 2 所示:


清单 2. 接收一个 ID 并将它上传到服务器

				
- (void)application:(UIApplication*)application
         didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

    NSString *tokenStr = [deviceToken description];
    NSString *pushToken = [[[[tokenStr 
      stringByReplacingOccurrencesOfString:@"<" withString:@""] 
      stringByReplacingOccurrencesOfString:@">" withString:@""] 
      stringByReplacingOccurrencesOfString:@" " withString:@""] retain];

   // Save the token to server

   NSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token", RINGFULDOMAIN];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
        
   [req setHTTPMethod:@"POST"];
   [req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
   NSMutableData *postBody = [NSMutableData data];
   [postBody appendData:[[NSString stringWithFormat:@"username=%@", username] 
      dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"&token=%@", 
      pushToken] dataUsingEncoding:NSUTF8StringEncoding]];

   [req setHTTPBody:postBody];
   [[NSURLConnection alloc] initWithRequest:req delegate:nil];
}


在理想情况下,您将令牌与一些标记用户的信息(如在您的系统中的个人用户名)相关联,使您的服务器知道稍后要将消息发送给谁。(您可以将它想像为类似于将电话号码与个人姓名相关联。)如果您没有将令牌与自己的用户标识信息关联,您仍然可以将消息发送到这些设备,但您不能为每个用户自定义消息,因为您所拥有的是一个目标设备的字母令牌字符串。

服务器应该将令牌及其相关的标识信息保存在数据库中。在大多数应用程序中,它被保存在用户配置文件数据库中。

发送一个推送消息

要发送一个推送消息,您的服务器:

  1. 查找即将发送消息的目标应用程序 ID 列表
  2. 根据收件人的用户配置文件为每个收件人个性化消息
  3. 联系 APNs 消息服务器

APNs 服务器的 Web 服务 API 很复杂。对 Java 开发人员来说幸运的是,开源 JavaPNS 库可以使其使用变得更简单。JavaPNS 和下载和文档链接参见 参考资料

清单 3 中的代码显示了如何使用 JavaPNS 库向设备发送类似于短信的消息:


清单 3. 发送一个推送消息

				
String[] devices = {"token1", "token2};
List<PushedNotification> notifications
 = Push.alert("Hello World!", "keypair.p12", "password", false, devices);


JavaPNS 库的主界面方法是在 Push 类中的静态方法。APNs 允许您在消息中嵌入各种内容。请参阅 iOS 推送消息指南,获取所支持的负载类型的完整清单(参见 参考资料)。Push 类为每种类型的消息提供方便的方法,并且它将消息的转换为 APNs 服务器接受的 JavaScript Object Notation (JSON) 格式。在 清单 3 中,keypair.p12 是从 KeyChain Access 导出的 p12 文件,password 是 p12 文件的密码。devices 阵列是从 iOS 应用程序接收的设备令牌列表。所有这些设备都将收到这个推送消息。在参数中的 false 值指定该消息应发送到 APNs 开发服务器(沙箱),而不是其生产服务器。(回忆一下,您通常为沙箱创建一个 p12 密钥对,为生产服务器创建一个不同的密钥对。)

方法调用返回的值是一个 PushedNotification 对象的列表,您可以用它来确定推送交付的状态,如清单 4 所示:


清单 4. 检查推送交付的状态

				
for (PushedNotification notification : notifications) {
    if (notification.isSuccessful()) {
        /* Apple accepted the notification and should deliver it */
    } else {
        String invalidToken = notification.getDevice().getToken();
        /* Add code here to remove invalidToken from your database */
    }
}


如果通知对象告诉您,有某个设备令牌不再处于激活状态,例如,如果用户从设备中删除了该应用程序,或在应用程序设置中禁用了通知,您应该从数据库中删除该令牌,以便您不会再向它发送消息。

保持最新的活动设备令牌列表的另一种方式,是让您的服务器应用程序定期检查 APNs 服务器。清单 5 显示了如何查询 APNs 反馈服务,使用 JavaPNS 从 APNs 沙箱接收一个无效设备令牌的列表:


清单 5. 检查以更新活动的设备令牌

				
List<Device> inactiveDevices = Push.feedback("keypair.p12", "password", false);
/* remove inactive devices from your own list of devices */


不要将资源浪费在将消息发送到已删除您的应用程序的设备,或选择不接收通知的设备,这一点很重要。

其他考虑事项

推送通知不能在 iOS 模拟器上进行测试;您必须将应用程序部署到实际设备上对其进行测试。因为用于对消息进行身份验证的数字证书被捆绑到应用程序的配置概要文件,您需要使用在开发或临时分发应用程序中的开发证书进行测试。在应用程序通过审批并在 App Store 中提供后,您必须切换到生产证书。

此外,重要的是要理解,为大数据库中的用户定制和发送推送消息是一项资源密集型工作。例如,每 5 秒遍历一次一个百万用户级的数据库,以确定 10 个当时需要收到消息的用户,这成本非常高。服务器端的基础架构需要精心的设计和规划,以支持对大量用户的频繁推送通知。相反,一次向一百万个用户发送推送消息会产生大量的流量,因此通过使用一个线程池可以更好地处理这一场景,而不是阻止一个单独线程。JavaPNS 库提供一个简单的 API,它使用线程池,可以同时将消息推送给大量设备。

结束语

推送技术让您的服务器应用程序绕过电信运营商,并直接通过 Internet 向 iOS 设备的应用程序发送消息。虽然实现推送通知并非小事(客户端 SSL 证书对 Apple 服务器的身份验证需求很复杂),但是来自 Urban Airship 和 JavaPNS 等第三方的帮助可以使发送通知更加容易。SMS 和 MMS 有自己的位置,并且仍然比推送技术更可靠,但您可以通过实现推送消息使您的 iOS 应用程序更加丰富,提供更多的功能。


参考资料

学习

获得产品和技术

  • JavaPNS:下载 JavaPNS JAR。 

  • 以最适合您的方式 评估 IBM 产品:下载产品试用版,在线试用产品,在云环境中试用产品,或者在 SOA 沙箱 中花几小时学习如何高效实现面向服务的架构。

讨论

  • 加入 IBM developerWorks 社区。查看开发人员推动的博客、论坛、群和维基,并与其他 developerWorks 用户交流。

关于作者

http://www.ibm.com/developerworks/i/p-myuan.jpg

Dr. Michael Yuan 是企业计算和消费者移动技术领域的著名技术专家。他是 5 本有关软件工程方面的书籍的作者,并已在同行评议和行业期刊上发表过 40 多篇文章。Dr. Yuan 在新兴的消费者驱动的医疗保健领域是先行者。他在 Ringful Health 从事的工作已经被全国各大媒体(如华尔街日报纽约时报 以及 洛杉矶时报)广泛地报道并获得认可。

分享到:
评论

相关推荐

    iOS10.0本地推送通知.

    在iOS系统中,推送通知是一项重要的功能,它能让应用程序在后台状态下向用户发送消息或提醒。随着iOS10.0的发布,苹果对推送通知服务进行了显著的改进和扩展,为开发者提供了更多自定义和交互的可能性。以下是关于...

    PushMeBaby ios推送通知测试工具

    当开发者想要向用户的iOS设备发送推送通知时,他们需要配置一个aps_developer_identity.cer证书,这个证书用于验证开发者有权发送推送通知到特定的应用。在PushMeBaby中,你可以替换这个证书,以便在不同的测试环境...

    push-notification-server, 向iOS或者Android设备发送推送通知的服务器代码.zip

    push-notification-server, 向iOS或者Android设备发送推送通知的服务器代码 推送通知服务器这可以用于向iOS或者Android设备发送推送通知。 Android推送通知SERVER_KEY - 如果你没有 SERVER_KEY,请使用本教程中的...

    关于IOS_APNS推送消息(iphone端+服务端)

    为了向APNs发送推送消息,你需要: 1. **创建APNs证书**:在苹果开发者中心,为你的App ID创建一个APNs证书,区分开发环境和生产环境。下载并双击安装到Keychain Access。 2. **构建推送消息**:推送消息包含头...

    ios推送工具.zip

    2. **设备令牌**: 每个安装了应用的iOS设备都会生成一个唯一的设备令牌,开发者需要将这个令牌传递给服务器,以便服务器知道应该向哪个设备发送推送通知。 3. **本地推送与远程推送**: iOS中的推送通知分为本地推送...

    ios 消息推送 java后端demo(包括jar包)

    在iOS应用开发中,消息推送是一项重要的功能,它允许服务器向设备发送通知,即使应用程序在后台运行或完全关闭。这个“ios 消息推送 java后端demo”是为开发者提供的一个示例,帮助理解如何使用Java后端实现对iOS...

    ios 推送通知

    在iOS平台上,推送通知是应用开发者与用户保持互动的重要手段,它允许应用程序在不实际运行时向用户发送消息。此压缩包文件包含了“ios 推送通知”相关的开发文档和SDK源码,对于理解并实现iOS设备上的推送通知功能...

    ios 远程推送发送器

    总之,iOS远程推送发送器是一个强大的辅助工具,它可以帮助开发者快速测试和优化推送通知功能,确保在实际环境中能够正常工作。理解APNs的工作原理以及如何配置和使用这样的工具,对于提高用户体验和保持应用活跃度...

    ios的服务器推送要点

    APNs是苹果公司提供的一个服务,用于向运行iOS或macOS的设备发送推送通知。当应用注册了APNs服务后,设备会生成一个设备令牌,服务器通过这个令牌向特定设备发送消息。 二、工作原理 1. 应用注册:应用启动时,请求...

    IOS推送通知测试工具PushMeBaby

    4. **发送推送**:点击“发送”按钮,PushMeBaby将通过APNs向指定设备发送推送通知。 5. **查看结果**:观察设备是否正确接收到推送,同时检查PushMeBaby的日志以确认无误。 三、注意事项与最佳实践: 1. **安全...

    iOS本地和推送通知编程指南

    而推送通知则是由应用服务器通过Apple的通知服务(APNs)发送到用户设备的通知。 文档中首先概述了本地通知和推送通知的基本概念。它解释了如何设计和构建通知,以便它们能够有效地通知用户应用程序中发生的重要...

    iOS推送服务器

    4. 后端集成:在服务器端,使用设备令牌和APNs证书建立连接,编写发送推送通知的代码。 5. 测试推送:发送测试通知,检查设备是否能正确接收和显示。 三、APNs的类型 1. 普通推送:包含简单的标题、正文和可能的...

    iOS信息推送总结

    - 用户可以选择是否允许应用发送推送通知,还可以在通知设置中定制每个应用的通知行为。 - 用户可以通过点击通知来启动应用或执行特定操作。 8. **后台模式**: - 当应用接收到推送通知时,可以在后台处理数据,...

    C#下IOS消息推送实例

    PushSharp提供了简单易用的API,帮助开发者轻松地向iOS设备发送推送通知。它支持HTTP/2和旧版的APNs协议,能够处理批量推送,错误重试,以及设备令牌管理。 **4. 配置PushSharp** 要使用PushSharp,首先需要在项目...

    iOS-远程推送流程

    这是为了后续服务端能够根据该标识符向特定设备发送推送消息。 **3. 服务端建立SSL连接** 服务端使用预先生成的证书文件,向苹果的APNS服务器发起SSL连接。连接成功后,服务端可以向APNS服务器发送包含推送消息...

    ios本地和远程推送通知编程指南

    本地推送通知(Local Notification)是iOS应用开发中的一个关键功能,它允许应用程序在没有服务器介入的情况下,向用户发送提醒或警报。这种通知可以设置在特定的时间触发,例如用来提醒用户即将进行的会议或任务。...

    iOS苹果推送apns测试工具.zip

    - 发送推送通知并观察设备上的接收情况。 - 分析返回的错误代码或状态,进行问题排查。 4. **调试技巧**:在测试过程中,开发者可能遇到推送未送达、设备令牌无效等问题。这时候,检查网络连接、验证证书是否正确...

    ios 推送通知(转载)

    iOS 推送通知是苹果设备上一种重要的用户互动机制,它允许应用程序在后台向用户发送消息,即使应用未运行。这种服务由Apple Push Notification service (APNs) 提供,用于实时地将服务器端的消息传递到用户的iOS设备...

    友盟推送配置教程iOS

    在完成以上步骤后,开发者需要在开发环境下进行推送功能的测试,确保推送通知能够成功送达至iOS设备。 根据提供的部分内容,我们注意到文章中提到了一些具体的技术点,例如: - cid: 指的是APNs证书ID。 - Apple ...

Global site tag (gtag.js) - Google Analytics