$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但未到达设备。
有什么想法吗?
答案 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);
}