通过Xcode使用开发SSL证书在设备上进行推送通知测试

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];

有什么建议吗?
3个回答

8

为了更好地解答有关证书/服务器/SSL的问题,请允许我进行一些补充说明:

生产/沙箱APNS根据代码签名设置选择

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

  • 使用iOS开发证书签署的应用程序将连接到并等待来自沙箱APNS环境的推送通知
  • 使用iOS发布证书(AppStore或Distribution > Ad-Hoc)签署的应用程序将连接到并等待来自生产APNS环境的推送通知。
  • 在构建过程中,Xcode会自动确定此设置,并且仅可通过选择在CodeSign步骤中使用的证书类型来进行配置。

问题1:我是否需要在我的服务器上安装开发SSL证书以测试开发证书已签署的应用程序的推送通知?

是的,一旦应用程序被签署,其APNS设置将使用前面部分中的规则封装到二进制文件中。然后,开发人员的服务器代码需要知道该设备生成的APNS令牌与Sandbox APNS环境相对应,因此服务器应将推送通知请求路由到gateway.sandbox.push.apple.com。

一些开发人员选择设置一个单独的服务器,该服务器可以进行这些区分,而其他人则选择设置其服务器的并排实例之一,其中一个设置为发送到生产环境,另一个设置为发送到Sandbox。

无论哪种方式,决定权在于个别开发人员及其服务器端代码的能力以及设置第二个服务器的相对复杂性。 无论哪种方式,在测试即将推出的功能时意外禁用生产推送通知然后忘记稍后重新启用它们可能会使用户感到沮丧,因此在探索生产代码时,务必小心

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

从原始的SSL角度来看,不会发生冲突-您应该能够在服务器以外的计算机上下载和打开/检查这两个证书,并查看证书的内容实际上是不同的。 从SSL角度将它们导入相同的服务器环境是完全允许的。要确保它们不同,请确保创建两个不同的certificateSigningRequest来请求证书,您将自然地获得不同的数据。

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


我需要一个理智的检查,这就是我所需要的——一个简单明了的解释。谢谢Bryan! - Mike

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

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

  3. 最好不要在代码中增加、减少或设置标记值。您的服务器应该在通知正文中返回标记值。例如,当您的应用程序未运行时,您无法处理推送,因此无法在代码中更改标记值。但是,如果您的推送包含标记值,则无论如何都会正确设置和显示。

这里是通知正文示例。将标记值传递给“badge”键: {"aps":{"alert":"This is message.","badge":7}}

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


但是即使我的负载有徽章值,我仍然需要使用[[UIApplication sharedApplication] setApplicationIconBadgeNumber:badgeValue];来设置徽章。 - user2268539
不需要,它会自动设置。如果您想手动设置某个值,请使用 setApplicationIconBadgeNumber: 方法。 - Rafael Kayumov
苹果文档称:如果目标应用程序在通知到达时未运行,则会播放或显示警报消息、声音或徽章值。如果应用程序正在运行,则iOS将其传递给应用程序委托作为NSDictionary对象。该字典包含相应的Cocoa属性列表对象(加上NSNull)。 - Rafael Kayumov
那就意味着你是对的。当应用程序处于活动状态时,您应该使用setApplicationIconBadgeNumber:方法设置徽章值,并从通知负载中获取该值... - Rafael Kayumov
为确保其正常工作,请在application:didFinishLaunchingWithOptions:方法中处理通知。使用以下代码获取通知:UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; - Rafael Kayumov
显示剩余2条评论

1
我只想在现有答案中添加一些内容。虽然在同一服务器上安装开发证书和生产证书不会发生冲突,但您可能会遇到存储在数据库中的设备令牌冲突问题。当您使用开发证书时,您会从苹果获得开发设备令牌,这些令牌与您为生产证书获取的生产设备令牌不同。如果您在同一个数据库中保留开发和生产设备令牌(如果您同时在开发和生产中使用相同的服务器,则可能会这样做),则如果使用开发设备令牌使用生产证书或反之亦然发送通知时会出问题。
这就是为什么苹果建议使用独立的开发和生产服务器。
此引用摘自Troubleshooting Push Notifications,这是一份非常有用的文档:
最常见的问题是无效的设备令牌。如果该令牌来自沙盒环境,比如在内部测试开发构建时,您不能将其发送到生产推送服务。每个推送环境将为同一设备或计算机发出不同的令牌。如果您将设备令牌发送到错误的环境,则推送服务将视为无效令牌并且丢弃通知。
注意:建议您为每个推送环境运行单独的提供程序实例,以避免发送设备令牌到错误的环境的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接