Как удалить токены устройства, полученные от Apple APNS - PullRequest
5 голосов
/ 02 марта 2010

Я успешно получаю данные обратной связи Apple APNS через PHP. Структура, которую я получаю (после некоторой обработки), выглядит примерно так:

Отметка времени

токен устройства

У меня вопрос, как узнать, какие из токенов устройства я должен удалить из своей базы данных и прекратить отправлять им уведомления.

Regardz

Младжо

Ответы [ 6 ]

11 голосов
/ 24 апреля 2013

Отметка времени является ключевым элементом здесь. Отметка времени, отправляемая Apple, указывает, когда служба push-уведомлений в последний раз пыталась доставить сообщение на устройство и обнаружила, что приложение удалено. Если после этого устройство повторно зарегистрировалось в вашем сервисе, удалять его не нужно.

Поэтому, каждый раз, когда ваше приложение загружается и отправляет токен в вашу службу, вы должны записывать время в своем хранилище данных. Когда вы запускаете обратную связь, вы должны проверить время от Apple и сравнить его с временем, когда вы последний раз получали обновление из приложения на устройстве. Если время, которое Apple отправляет, новее, чем время, в которое вы получили обновленное сообщение, вам следует удалить (или отключить) устройство. Если время от Apple раньше, вам не нужно его удалять, поскольку пользователь переустанавливал устройство с момента последней попытки доставки Apple.

10 голосов
/ 02 марта 2010

Все устройства, отправленные с помощью обратной связи, «неисправны» и должны быть удалены. Отсутствие обратной связи означает, что никакие устройства не должны быть удалены. Это описано в документации Apple:

Документация Apple APN

0 голосов
/ 27 мая 2015

Метка времени (в виде четырехбайтового значения time_t), указывающая, когда APNs определил, что приложение больше не существует на устройстве. Это значение, который находится в сетевом порядке, представляет секунды с 12:00 полуночи 1 января 1970 года по Гринвичу.

вы можете сравнить его с последним временем вставки вашей таблицы, а затем удалить недействительный токен из db. В моем случае я использую mysql и php для стороны сервера

$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1";

он вернет последнее обновленное время из дБ, а затем я просто конвертирую его в метку времени эпохи, используя

$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')";

и, наконец, я просто сравниваю его с отметкой времени обратной связи apns, как это

if($inactive_Timestamp>$dbTime_stamp)
  {
foreach ($apnsfeedback_tokens as $key => $value) {
  # code...

  $inactive_Token=$value['devtoken'];

 $sql= "DELETE FROM device_tokens WHERE device_token='$inactive_Token'";


if ($conn->query($sql) === TRUE) {
    echo "Record deleted successfully";
} else {
    echo "Error deleting record: " . $conn->error;
}
0 голосов
/ 04 февраля 2014

@ fyasar

Таким образом, ваша рекомендация - хранить токен устройства против идентификатора устройства (или некоторого ключа). Когда обратная связь получена для токена устройства, удалите строку токена устройства из БД, верно? Если вы правильно поняли, это не сработает в сценарии, если пользователь установит приложение, удалит его, а затем снова установит его, и служба обратной связи будет запрашиваться только после всего этого. В этом случае, если отметка времени в обратной связи не учитывается, маркер устройства будет удален, что неверно, поскольку пользователь снова установил приложение и повторно зарегистрировался для push-уведомлений.

У меня такой вопрос, как предлагается в Apple Doc и многих блогах, при регистрации, когда маркер устройства сохраняется, временная метка должна сохраняться вместе с ним. Какой часовой пояс ISO должен быть сохранен, или в каком часовом поясе служба обратной связи возвращает временную метку.

0 голосов
/ 03 февраля 2014

аккуратное объяснение @argon, однако у меня есть еще один вопрос о отметке времени.

Каждый раз, когда приложение включает push-уведомление, токен устройства отправляется на сервер. Должен ли я взять метку времени с моего сервера, чтобы она сохранялась вместе с маркером устройства, поскольку didRegisterForRemoteNotificationsWithDeviceToken выдает только deviceToken, а не время. Если мой сервер работает в другом часовом поясе, а APNS работает в другом часовом поясе, то сохраненное время регистрации (вместе с токеном устройства) нельзя сравнить с отметкой времени, полученной из обратной связи APNS, чтобы проверить последовательность регистрации -> удалить -> перерегистрировать.

Я предполагаю, что временная метка обратной связи APNS указана в UTC, а временная метка, которую сервер хранит вместе с токеном устройства, должна быть преобразована в UTC перед сохранением временной метки ISO. Таким образом, временная метка будет находиться в одном часовом поясе, а проверка различий будет согласованной.

уточните пожалуйста

0 голосов
/ 13 августа 2010

Вам следует хранить устройства с данными их токенов, а затем вы можете найти эти устройства в соответствии с их токенами. Вы можете использовать токен устройства для идентификатора каждого устройства. Чем было бы легко найти и изменить их статусы в вашей БД.

...