3

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

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

代码部分:

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

有什么建议么?

4

3 回答 3

8

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

基于 Codesign 设置选择的 Prod/Sandbox APNS

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

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

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

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

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

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

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

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

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

于 2013-04-17T07:48:15.150 回答
2
  1. 是的,您应该在服务器上安装开发 SSL 证书。您还必须使用带有此证书的沙盒推送通知服务 (gateway.sandbox.push.apple.com)。

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

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

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

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

于 2013-04-17T07:10:48.297 回答
1

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

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

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

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

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

于 2013-04-17T14:37:40.303 回答