2016-03-30 15 views
1

Как многие из вас знают, что для того, чтобы дать поддержку Push-уведомления в моем приложении мне нужно две вещи, которые должны быть сохранены в MySQL:Swift: почему устройство изменяется каждый раз, когда создается или устанавливается новая версия приложения?

  • идентификатор устройства
  • устройство лексема

, который я соответственно получают с:

  • let device = UIDevice.currentDevice().identifierForVendor!.UUIDString
  • let deviceTokenString: String = (deviceToken.description as NSString).stringByTrimmingCharactersInSet(characterSet).stringByReplacingOccurrencesOfString(" ", withString: "") as String

Всегда, как вы знаете, каждый раз, когда приложение запускается, он пытается зарегистрироваться в appostite MySQL push push notifications, но если он уже присутствует (его идентификатор устройства уже присутствует), то новая регистрация будет отброшена. Во всяком случае, я только что понял (как объяснил here), идентификатор устройства изменяется каждый раз, когда новая версия приложения переустанавливается на моем iPhone. Риск состоит в том, чтобы заполнить таблицу eith слишком много бесполезных записей. Есть ли способ сохранить один и тот же идентификатор устройства? Или, что является самым умным способом справиться с этим?

+1

У вас есть какая-либо учетная запись пользователя в вашей системе? обычно токен подключается к определенной учетной записи пользователя, и если токен ввода изменяется, вам просто нужно обновить одну запись на сервере db – heximal

+0

да, у меня есть учетная запись в моем iphone (классическая учетная запись Apple), но я боюсь, что это бесполезно, потому что устройство id изменяется при установке новой версии приложения. Прочтите ссылку Я отправил – user1576208

ответ

0

Push-уведомление работает с 2 вещами: один является идентификатором устройства (идентификатор устройства/пользователя, который в основном реализуется владельцем приложения), а другой - маркер GCM (который генерируется и поддерживается сервером Google GCM для каждая установка).

Идентификатор устройства может быть любым идентификатором, с помощью которого вы идентифицируете пользователя/устройство и т. Д. Маркер устройства генерируется сервером google, который восстанавливается каждый раз, когда приложение установлено.

Теперь предположим, что приложение установлено на вашем телефоне, поэтому в вашей базе данных MySql будет содержаться 1 строка, содержащая ваш идентификатор deviceId и GCM, GCM будет работать именно этим.

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

Это то, что я мог понять из вашего вопроса. Надеюсь это поможет.

+0

Спасибо за ваш ответ, но я боюсь, что это не так, как вы сказали. Если вы читаете здесь (http: // stackoverflow.com/questions/25925481/how-to-get-a-unique-device-id-in-swift) ясно сказано, что идентификатор устройства изменяется КАЖДОЕ ВРЕМЯ, приложение перезагружается в iphone. Таким образом, он не остается прежним ... Я написал серверный элемент управления, о котором вы говорили, но он не всегда работает, потому что с новой установкой/выпуском приложения изменяется и идентификатор устройства. см. ссылку – user1576208

+0

Друг! вы делаете это неправильно. Быстрое изменение идентификатора устройства при каждой установке, но способ реализации push-уведомлений аналогичен. Идентификатор пользователя является постоянным, а токен изменяется при каждой установке. –

+0

** Больше не существует способа однозначно идентифицировать устройство после того, как пользователь удалил приложение. ** В документации говорится: «Значение в этом свойстве остается неизменным, пока приложение (или другое приложение от того же поставщика) устанавливается на устройстве iOS. Значение изменяется, когда пользователь удаляет все приложения этого поставщика с устройства и затем переустанавливает один или несколько из них ». – user1576208

1

Идентификатор устройства не доступен для кода проекта iOS. Единственная возможность удалить маркер «мертвого» тотала - проверить, действителен ли токен токена. Это разумно сделать, когда вы отправляете push. Если он недействителен, удалите его из таблицы Mysql. Посмотрите на это SO Question and answer. Также важно проверить токены с точки зрения того, что Apple может применять санкции к тем разработчикам, которые посылают множество запросов на нажатие мертвых токенов.

+0

Я действительно боюсь, что вы правы. Итак, как я могу понять на стороне PHP, если токен уже недействителен? возможно, когда 'stream_socket_client' терпит неудачу или когда сбой отправки сообщения? – user1576208

+0

лучше использовать неудачную отправку в качестве атрибута недействительного токена. даже если это ложная тревога, и вы случайно удалили этот токен, в следующий раз, когда это устройство снова отправит вам этот токен, так как оно живое, и вы снова сохраните его в базе данных. – heximal

+0

Возможно, это решение: http://stackoverflow.com/questions/15943671/how-get-feedback-from-apns-when-sending-push-notification – user1576208