$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 жетонами push-уведомлений. Используя PHP, я получаю эти токены и отправляю уведомление для каждого токена в APNS.
Проблема в том, что только половина получает уведомления. У меня такое ощущение, что это потому, что один из токенов недействителен (или что-то в этом роде), и он мешает ему отправлять остальные токены.
Я проверил значение $result
и каждый возвращает истину. Это означает, что все уведомления успешно отправляются в APNS, но не доставляются на все устройства.
Возможно ли, что неверный токен может нарушить доступ остальных устройств к устройствам? Я не уверен, что здесь происходит, но я знаю, что все уведомления успешно отправляются в APNS, но не достигают устройств.
Есть идеи?
Неверные токены не будут мешать остальным уведомлениям достигать устройств.
У меня та же проблема раньше, проблема была с отправленными сообщениями.
Проверьте длину ваших сообщений, полезная нагрузка уведомления составляет 256 байт).
Проверьте кодировку ваших сообщений, используйте escape-последовательность для сообщений ASCII.
Если вы отправляете на одно и то же устройство несколько раз, Apple отправит только последнее уведомление.
Убедитесь, что ваши токены предназначены для той же рабочей среды, токены песочницы не будут работать с производственным сервером.
Проверьте технические примечания Apple для получения дополнительной информации:
https://developer.apple.com/library/mac/technotes/tn2265/_index.html#//apple_ref/doc/uid/DTS40010376-CH1-TNTAG23
Как говорится в Apple Документация:
«Помните, что доставка уведомлений -« лучшее усилие »и не гарантируется».
(Связал соответствующий вопрос с тем же ответом — спасибо Джо)
APNS теперь гарантированно доставлены, учитывая, что пропуска в книжке гарантированы
Текущий уровень принятия iOS 7 к iOS 8 составляет 50/50. Вы удостоверились, что ваши приложения регистрируются отдельно для каждой ОС в вызове didFinishLaunching в AppDelegate? Данные свидетельствуют о том, что он работает для одной ОС, а не для другой? Пример кода в 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);
}