只有一半推送通知到达设备(APNS)

时间:2014-11-09 17:46:43

标签: php ios iphone apple-push-notifications

$usersStmt = self::$db->query("SELECT `token` FROM `tokens`");
$users = $usersStmt->fetchAll(PDO::FETCH_COLUMN);

foreach ($users AS $userToken) {
    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $userToken)) . chr(0) . chr(strlen($payload)) . $payload;
    $result = fwrite($fp, $apnsMessage);
}

我的桌子里面有10个推送通知令牌。使用PHP,我获取这些令牌并将每个令牌的通知发送给APNS。

问题是,只有一半实际收到通知。我有一种感觉,这是因为其中一个令牌无效(或沿着这些行的某些东西)并且它阻止它发送其余的令牌。

我检查了$result的值,每个都返回true。这意味着所有通知都已成功发送到APNS,但未传送到所有设备。

无效令牌是否可能会阻止其他通知到达设备?我不确定这里发生了什么,但我知道所有通知都已成功发送到APNS但未到达设备。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

无效的令牌不会中断其他通知到达设备。 我之前有同样的问题,问题出在自己发送的消息上。 检查消息长度,通知有效负载为256字节)。 检查消息编码,使用无ASCII消息的转义序列。 如果您多次发送给同一设备,Apple将仅发送最后一个通知。 确保您的令牌适用于相同的工作环境,沙盒令牌将无法与生产服务器一起使用。 查看Apple技术说明以获取更多信息: https://developer.apple.com/library/mac/technotes/tn2265/_index.html#//apple_ref/doc/uid/DTS40010376-CH1-TNTAG23

答案 1 :(得分:0)

正如Apple Documentation中所述:

"请记住,通知的发送是“尽力而为”,并不能保证。"

(与相同答案相关的相关问题 - 感谢Joe)

Are APNS now guaranteed delivery given that passbook passes are guaranteed

答案 2 :(得分:0)

目前iOS 7至iOS 8的采用率为50/50。您是否确保应用程序在AppDelegate的didFinishLaunching调用中为每个操作系统单独注册?数据是否表明它适用于一个操作系统,而不适用于另一个操作系统? App Delegate中的示例代码:

if(iOS8){

    [self.application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [self.application registerForRemoteNotifications];
    NSLog(@"Register for iOS 8 Notifications %@", application);

}else{

    // iOS 7 Notifications
    [self.application registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
    NSLog(@"Register for iOS 7 Notifications %@", application);
}