Как определить, когда обновлять deviceToken для push-уведомлений / как его получить?
У меня были различные проблемы с push-уведомлениями в течение моего приложения, которые, кажется, были исправлены удалением. Я считаю, что я сузил его до просроченных устройств.
Читая документацию Push-уведомлений Apple, я нашел это:
Регистрация прошла успешно, но уведомления не получены
,,,
Возможно, ваше приложение отправило неверный токен устройства вашему провайдеру. Ваше приложение должно всегда запрашивать токен устройства, регистрируясь в сервисе push при каждом запуске. Не храните токен устройства в своем приложении и не пытайтесь использовать его повторно, потому что токен может измениться. Затем ваш провайдер должен передать этот же токен службе push.
Они предлагают регистрироваться каждый раз, когда приложение запускается. Они также рекомендуют не делать этого с помощью push-уведомлений, поскольку пользователям не нравится, когда их забрасывают запросами на доступ еще до того, как они увидят ваше приложение. Так что просто бросить регистрационный вызов в делегат приложения - не лучший вариант. Тем не менее, я не вижу больше информации о том, когда истек срок действия deviceToken или как узнать, истек ли он.
Самая близкая вещь, которую я могу найти, - это документация на UIApplication
метод экземпляра isRegisteredForRemoteNotifications
:
Возвращаемое значение YES, если приложение зарегистрировано для удаленных уведомлений и получило свой токен устройства, или NO, если регистрация не произошла, не удалась или была отклонена пользователем.
Насколько я понимаю, это метод вызова, чтобы проверить, активировал ли пользователь службы push-уведомлений. Я понимаю, что разрешения для определенных типов уведомлений могут быть отключены, и это все еще может быть правдой, если пользователь разрешает push-уведомления. Но формулировка выглядит так, как будто требуется, чтобы приложение было зарегистрировано на текущем устройстве. Значит ли это, что я могу позвонить
[[UIApplication currentApplication] isRegisteredForRemoteNotifications]
внутри appDelegate, и если это правда, зарегистрировать удаленные уведомления, чтобы обновить мой deviceToken на моем сервере и убедиться, что срок действия моих push-уведомлений не истек? Или эта функция столкнется с тем же, что и сейчас, где в конце концов срок действия deviceToken истечет, и этот метод начнет возвращать false вместо true, даже если пользователь разрешил push-уведомления?
tl; dr - Apple говорит, что DeviceTokens в конце концов истекает для push-уведомлений. Они предлагают регистрироваться каждый раз, когда приложение запускается. Я не хочу бомбардировать новых пользователей этим предупреждением. Как обеспечить повторную регистрацию только тех пользователей, которые уже приняли push-уведомления?
2 ответа
Хорошо, лучшая практика для этого заключается в следующем, который мы следуем без сбоев
Всегда регистрируйтесь для запуска приложения Push on или в подходящих методах жизненного цикла AppDelegate, используя следующий код
[[UIApplication sharedApplication] registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications];
Делегат для Push, если он успешно зарегистрирован, будет вызван с deviceToken
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
Вышеуказанный делегат будет вызван, если всегда есть изменение в deviceToken. Поэтому, когда вы получаете устройство, обновите его на сервере.
На сервере убедитесь, что вы нажали правильный режим, если вы работаете в Песочнице или Производственном режиме, отмените значения из Симуляторов, которые они обычно дают сбой, и заблокируйте службу на некоторое время.
С помощью файла pem и маркера устройства вы всегда можете проверить, работает ли Push с этим онлайн-сервисом или нет.
Надеюсь, поможет.
Приветствия.
Предупреждение будет показано только один раз.
Если пользователь ранее разрешил уведомления, ваш код получит новый токен без необходимости какого-либо взаимодействия с пользователем (или уведомления пользователя).