【发布时间】:2011-10-12 08:40:48
【问题描述】:
您好,我是 iPhone 新手。
我正在开发 Iphone 应用程序,该应用程序在开发环境中成功接收推送通知,但在临时分发中没有收到通知。
我有两个证书,即开发和生产。
谁能告诉我我错过了什么?
【问题讨论】:
标签: ios push-notification apple-push-notifications
您好,我是 iPhone 新手。
我正在开发 Iphone 应用程序,该应用程序在开发环境中成功接收推送通知,但在临时分发中没有收到通知。
我有两个证书,即开发和生产。
谁能告诉我我错过了什么?
【问题讨论】:
标签: ios push-notification apple-push-notifications
正如我昨天发布的同样问题的答案:(prev. answer)
我也有类似的问题。经过一番测试,我得出以下结论:
如果安装的应用程序(使用development provision profile 编译)比此类设备具有development token 并且您应该使用development certificate 向此类设备发送推送。
如果安装的应用程序(使用distribution provision profile 编译)比此类设备具有production token 并且您应该使用production certificate 向此类设备发送推送。
而且,如果您的应用尚未发布,我认为 APNS 不会接受 production certificate,因此您可能无法将推送发送到您的临时应用。
你能做什么?例如,将应用程序发送给使用development certificate 编译的测试人员。
更新: 这个问题我又学了一遍,发现了一些有趣的信息:
Ad-hoc provision profile。<key>aps-environment</key>
<string>production</string>
aps-environment 的值。是否等于production?
如果是,那么您应该使用production certificate 向您的临时应用发送推送通知。
如果值为development,那么您应该使用development certificate 向您的临时应用发送推送通知。
Production Push SSL Certificate是否启用。如果这对您没有帮助,请尝试更新您的临时配置文件。
【讨论】:
pushmebaby 应用程序生成通知。谢谢
在测试开发环境的推送通知时,应该牢记一些重要的清单。其中大部分已经在上面提到过。但这是解决我问题的一件事,我想分享。我希望它可以帮助某人。那就是:
请注意设备令牌ID,这对于开发和生产环境是不同的。
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *deviceTokenStr = [[[[deviceToken description]
stringByReplacingOccurrencesOfString: @"<" withString: @""]
stringByReplacingOccurrencesOfString: @">" withString: @""]
stringByReplacingOccurrencesOfString: @" " withString: @""];
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:deviceTokenStr message:Nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
【讨论】:
推送通知有时令人头疼,它由许多元素组成。如果您在途中遗漏了某些东西,您的 PNS 将无法工作,并且很难理解原因。根据经验,请查看以下清单:
- 推送证书和私钥使用正确的应用 ID(与配置文件附加到的相同)正确生成。
- 证书和私钥都来自同一个下载的 PNS 证书。
- 两个文件都正确连接成一个 .pem 文件。
- 当应用处于活动状态时,您的应用会在推送通知进入时对其进行处理。
无论如何,我建议遵循一个好的教程,例如:http://mobiforge.com/developing/story/programming-apple-push-notification-services 逐字逐句。祝你好运!
【讨论】:
pushmebaby 应用程序。
我遇到了同样的事情,并花了很长时间试图弄清楚。我生成了一个新的生产证书,创建了一个 Ad-Hoc 配置文件(以便我可以通过生产中的推送通知进行测试),但没有任何效果。
我相应地修复了推送脚本(服务器端)(使用新生成的 .pem 文件并连接到 ssl://gateway.push.apple.com:2195)。脚本告诉我通知已发送,但我的设备实际上并没有收到。
原来这个问题真的很傻!显然,当使用带有新证书的应用程序(或者通过 Ad-Hoc)时,设备令牌会发生变化。我只能推测它们改变的原因,但我所知道的是,一旦我抓住了正确的令牌并使用我的测试脚本向设备发送通知,我就明白了!
【讨论】:
除了来自 Nekto 的猜测...
而且,如果您的应用尚未发布,我认为 APNS 将不接受生产证书,因此您可能无法将推送发送到您的临时应用。
与此同时,我可以确认,即使应用程序尚未发布,也可以在临时应用程序上接收推送通知。
【讨论】:
据我了解,您无法向具有开发证书的 Ad Hoc 构建发送通知。正如您可以想象的那样,在您发布应用程序之前,这种情况是可以的。发布应用程序后,向包含生产证书的临时构建发送通知也会将它们发送给您的应用程序持有者。我解决这个问题的方法是:
现在您将拥有一个可以专门用于测试通知的应用。这不是一个优雅的解决方案,但它确实有效。
【讨论】:
我刚刚克服了一个非常相似的问题,结果它可能应该是显而易见的,但我会在这里发布,以防其他人像我一样愚蠢。
我正在使用MoonAPNS,可以接收开发通知,但不能接收生产通知。
兜了几天兜兜转转,又回到了这一行:
PushNotification push = new PushNotification(true, p12file, p12password);
之前忽略了true 参数,通过服务器代码进行的调试显示这是设置是否使用沙盒服务器 - 哦!切换到false,一切都很好。
故事的寓意:不要忘记将通知指向非沙盒服务器!
【讨论】:
我遇到了同样的问题,经过大量的睾丸后,我终于找到了问题所在。
那是因为苹果生产的apns服务器不再允许包含私钥数据的P12文件。但是开发 apns 服务器将接受包含私钥的 P12 文件。
因此,当您从钥匙串导出 P12 文件时,只需选择没有私钥的生产证书文件,您就会在您的临时应用程序上收到通知(即使未发布)。
【讨论】:
2016.10.13 的答案
在我更改以下教程的密钥后,我遇到了类似的问题: https://support.magplus.com/hc/en-us/articles/203808718-iOS-Creating-a-Push-Notification-Certificate
但仍然无法工作 在我检查服务器代码后发现
ssl:ssl://gateway.sandbox.push.apple.com:2195
必须改为ssl://gateway.push.apple.com:2195
更改后,我可以收到通知
【讨论】: