通过带有开发 SSL 证书的 xcode 在设备中推送通知测试

Posted

技术标签:

【中文标题】通过带有开发 SSL 证书的 xcode 在设备中推送通知测试【英文标题】:push notification testing in device through xcode with development SSL certificate 【发布时间】:2013-04-17 06:42:38 【问题描述】:

我的应用已经在应用商店中,并且推送通知处于活动状态并且可以正常工作(使用生产证书)。现在我需要在应用程序中添加徽章(在它们只是警报之前)(已经在服务器端实现)。因此,为了进行测试,我需要一个开发 SSL 证书。所以以下是我的查询:

    我是否必须在我的服务器上安装开发 SSL 证书才能使用开发证书在 iPhone 上进行测试? 它不会与服务器上已安装的生产 SSL 证书冲突。 我是否必须使用以下代码在 didReceiveRemoteNotification: 和 didFinishLaunchingWithOptions: 委托中添加徽章:

代码部分:

NSString* alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"badge"];  
NSLog(@"my message-- %@",alertValue);  
int badgeValue= [alertValue intValue];  
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:badgeValue];

有什么建议吗?

【问题讨论】:

【参考方案1】:

只是为已经提出的证书/服务器/SSL问题和答案添加一些额外的颜色:

根据 Codesign 设置选择的产品/沙盒 APNS

为了全面起见,让我们先快速回顾一下 APNS 环境:

使用 iOS 开发 证书进行代码签名的应用程序连接到并等待从 沙盒 APNS 环境发送推送通知 使用 iOS Distribution 证书(AppStore 或 Distribution > Ad-Hoc)进行代码签名的应用程序连接到并等待从 Production APNS 发送推送通知环境。 此设置由 Xcode 在构建过程中自动确定,只能通过选择 CodeSign 步骤中使用的证书类型进行配置。

问题 1:我是否必须在我的服务器上安装开发 SSL 证书才能测试开发证书签名应用推送通知?

是的,一旦应用经过代码签名,它的 APNS 设置就会使用上一节中的规则密封到二进制文件中。然后由开发人员的服务器代码决定设备将生成的 APNS 令牌与沙盒 APNS 环境一起使用,并且服务器应该将该请求路由到 gateway.sandbox.push.apple.com。

一些开发人员选择设置能够进行这些区分的单个服务器,而其他开发人员选择设置其服务器的并行实例,一组发送到生产,另一组发送到沙盒。

无论哪种方式,决定权在于个人开发人员以及他们的服务器端代码能够做什么以及设置第二台服务器的相对复杂性。无论哪种方式,如果您在测试即将推出的功能时不小心禁用了生产推送通知,然后忘记重新启用它们,用户可能会感到不安,因此在查看生产代码时一定要小心

问题 #2:开发和生产 SSL 证书会冲突吗?

从原始 SSL 的角度来看,它们不会发生冲突——您应该能够在服务器以外的机器上下载并打开/检查这两个证书,并看到证书的内容实际上是不同的。将它们导入相同的服务器环境(同样从 SSL 的角度来看)是完全允许的。为确保它们不同,在请求证书时,请确保您创建了两个不同的 certificateSigningRequests,这样您最终会得到不同的数据。

从开发人员的服务器端推送代码的角度来看——这取决于。请参阅问题 1 中有关服务器端代码功能的对话。如果服务器代码的设计考虑到这一点,那么理论上答案也是“不,它们不会发生冲突”,但这是个别开发人员需要对自己的服务器端代码能力做出的决定。

【讨论】:

我需要一个健全性检查,这就是我所需要的——一个简单直接的解释。谢谢布莱恩!【参考方案2】:

    是的,您应该在服务器上安装开发 SSL 证书。您还必须使用带有此证书的沙盒推送通知服务 (gateway.sandbox.push.apple.com)。

    我猜他们不会冲突。您应该只为 AppStore 应用程序使用生产 SSL,为测试应用程序使用开发 SSL。

    最好不要在代码中增加或减少或设置标记值。您的服务器应在通知正文中返回徽章值。例如,当您的应用程序未运行时,您无法处理推送,因此您无法在代码中更改徽章值。但是,如果您的推送包含徽章值,它将以任何方式正确设置和显示。

这是通知正文示例。传递关键“徽章”的徽章值: "aps":"alert":"这是消息。","badge":7

顺便说一下,didReceiveRemoteNotification: 方法总是在你的应用收到推送时调用。即使应用程序关闭,它也会在您从推送启动应用程序时调用。

【讨论】:

但我必须使用 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badgeValue] 设置徽章;即使我的有效负载具有徽章价值? 不,它会自动设置。如果您想手动设置一些值,请使用 setApplicationIconBadgeNumber: 方法。 但是到目前为止我看到的每个帖子都写了代码 NSString alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"badge"]; NSLog(@"我的消息-- %@",alertValue); int badgeValue= [alertValue intValue]; [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badgeValue];设置徽章 Apple 文档说:如果目标应用程序在通知到达时没有运行,则会播放或显示警报消息、声音或徽章值。如果应用程序正在运行,ios 会将其作为 NSDictionary 对象传递给应用程序委托。字典包含相应的 Cocoa 属性列表对象(加上 NSNull)。 这意味着你是对的。当应用程序处于活动状态时,您应该使用 setApplicationIconBadgeNumber: 方法设置徽章值,从通知负载中获取值...【参考方案3】:

我只是想在现有答案中添加一些内容。虽然开发证书不会与安装在同一台服务器上的生产证书冲突,但您可能会与存储在数据库中的设备令牌发生冲突。当您使用开发证书时,您会从 Apple 获得开发设备令牌,这与您为生产证书获得的生产设备令牌不同。如果您将开发设备令牌和生产设备令牌保存在同一个数据库中(如果您将同一服务器用于开发和生产,您可能会这样做),如果您使用生产证书发送带有开发设备令牌的通知,您将遇到麻烦,反之亦然.

这就是为什么 Apple 建议使用单独的服务器进行开发和生产。

此引文摘自Troubleshooting Push Notifications,这是一个非常有用的文档:

最常见的问题是设备令牌无效。如果令牌来了 从沙盒环境中,例如当您测试一个 内部开发,您不能将其发送到生产推送 服务。每个推送环境都会为 相同的设备或计算机。如果您确实将设备令牌发送到错误的 环境中,推送服务会将其视为无效令牌,并且 丢弃通知。

注意:建议您运行一个单独的实例 为每个推送环境提供provider,避免发送问题 设备令牌到错误的环境。

【讨论】:

以上是关于通过带有开发 SSL 证书的 xcode 在设备中推送通知测试的主要内容,如果未能解决你的问题,请参考以下文章

iOS MDM 服务器 SSL 证书不受设备信任

使用带有 SSL 证书的 PHP cURL 时出错

通过带有 SSL 和证书的 Phonegap 连接到 Web 服务器

带有 iOS 8(Xcode 6)的 iOS 模拟器未显示在 Safari 开发菜单中

Xcode bot 安装链接请求超时

带有 iOS 应用程序的 SSL 证书