iPhone iOS生产环境下推送通知APNS未发送

12

我已经在做这个项目有一段时间了。 我知道有很多文章,也学到了很多关于这方面的知识。

我以相同的方式创建了我的开发和生产SSL。 开发环境连接到ssl://gateway.sandbox.push.apple.com:2195 生产环境连接到ssl://gateway.push.apple.com:2195 连接似乎没有问题。

对于应用程序。 开发环境: 当我直接从xCode在我的设备上运行它时,它运行的是开发版本。该应用程序成功记录了数据库中的开发令牌。然后我运行服务来发送推送通知,它会被正确地传递。消息被成功投递。

Ad-hoc环境: 当我构建一个存档并将其导出用于Ad-hoc分发时,我会仔细检查包内容codesign -dvvvv --entitlements - Elepago.app,并查看aps-environment是否正确设置为生产环境。我将其打包并通过iTunes加载到我的设备上。当应用启动时,我会看到新的生产令牌记录在数据库中。所以环境必须设置正确。当我向生产密钥发送推送通知(与开发环境完全相同,只需更改SSL .pem密钥和服务器),它显示成功交付。但是实际上它从未到达设备!!!

这个问题让我发疯了。我刚刚清理了我的分发证书,并使用全新的CSR重新构建了它。我还更新了所有的配置文件,以使用该新证书。[有什么想法来解决这些证书与应用程序的联系,除了我已经检查过的aps-environment吗?]

任何见解都将不胜感激。


在设置 -> 通知 中是否启用了您的应用程序的通知? - feco
感谢您的帮助。它们在开发中可以正常工作(push notifications do work on development)。即使在生产版本中,我每次都能收到推送密钥,所以这些权限似乎都是正确的... - Federico
@Federico 你确定你发送通知到生产设备标记了吗? - Eran
是的。我正在手动进行测试。每当我加载应用程序的开发版本(直接从xCode),设备会将开发pn令牌注册到数据库中。在这个版本中,它始终保持不变。我拿到那个密钥并手动放入我的php文件中进行测试。然后推送通知就会被传递。_当我运行它时,pn令牌在数据库中会改变-我认为是因为它是生产令牌。当我替换令牌,将服务器和ssl证书更改为生产环境时,我什么也收不到。设备上没有推送通知。没有错误消息。 - Federico
存在不同的“开发者”和“生产”设备令牌,这让我在测试中耽误了几个小时。在哪里提到了每种情况下令牌是不同的? - GoldenJoe
4个回答

8
所以经过无数个小时的头疼,我最终重建了SSL .pem文件,它起作用了!
这是我所做的: - 清除了我的分发证书并创建了一个新的证书 - 将所有配置文件与新证书相关联 - 在xCode中加载新的配置文件 - 按照Raywenderlich的精彩教程的说明重建我的SSL握手.pem文件
这些是我最初用于开发和生产的相同指示,但可能/显然出了些问题。 然后我在我的ad-hoc版本上进行了测试,它奏效了!
此外,值得注意的是,当使用错误的.pem密钥时,我未收到任何来自APNS的错误反馈。 我使用上面链接中找到的simplepush.php文件作为发送PN的基础。

4

开发和生产环境的设备令牌不同。

在测试生产环境时,使用UIAlertView来查看您的生产环境令牌。可以采取如下操作:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
    NSString *deviceID = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    deviceID = [deviceID stringByReplacingOccurrencesOfString:@" " withString:@""];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Device Token", nil) message:deviceID delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil) otherButtonTitles:nil];
    [alert show];
}

使用此令牌推送生产通知。


1
任何内部分发配置文件都会分配相同的tokenID,但是这个tokenID在不同设备上会有所不同。 另外一个问题可能只与ProductionURL有关。 我还注意到推送通知有时会延迟接收,尤其是在使用生产URL时。希望这可以帮助到您。

0

我的问题与Java开发时相同,但我解决了它,因为production = true是用于生产环境,而production = false则用于开发环境。

负载(payload,keystore,密码,production,devices)

希望这有所帮助。


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