У меня есть особая проблема синхронизации с моим приложением, которой я хотел бы поделиться с вами и получить некоторые идеи, которые, надеюсь, помогут мне решить ее.
Я разрабатываю приложение, которое в основном делает 2 вещи:
1) Регистрирует push-уведомления в AppDelegate
.
2) Открывает веб-представление в ViewController
и загружает URL-адрес. Форма загружаемого URL-адреса всегда выглядит следующим образом: http://.www.thisIsMyUrl.com/UDID
, где UDID — уникальный идентификатор пользователя.
В didRegisterForRemoteNotificationsWithDeviceToken:
я регистрируюсь для токена, и после его получения внутри этой функции я делаю http-запрос на свой сервер, куда я отправляю токен push и UDID.
Таким образом, и в didRegisterForRemoteNotificationsWithDeviceToken
, и в AppDelegate
, и в ViewController
я получал UDID и использовал его, как я описал.
Все до прошлой недели работало отлично. Однако теперь Apple решила отклонить любое приложение, использующее UDID. Поэтому для меня выход — создать уникальный идентификатор с помощью CFUUID и сохранить его в цепочке ключей.
Проблема :
Как видите, я использую уникальный идентификатор как в функции AppDelegate didRegisterForRemoteNotificationsWithDeviceToken
, так и внутри файла ViewController
. Однако он должен быть создан только в одном из этих контроллеров, иначе он будет другим!!! (Помните, что строка CFUUID создается с помощью UDID + dateNtime).
Где его создать??? didRegisterForRemoteNotificationsWithDeviceToken
является асинхронным, поэтому, если я получу его там, viewController сделает http-запрос задолго до того, как туда попадет уникальный идентификатор, и вместо этого будет использовать null
. То же самое, вероятно, могло произойти и с ViewController
. Если я попытаюсь создать его там, возможно, функция didRegisterForRemoteNotificationsWithDeviceToken
будет вызываться быстрее и попытается зарегистрировать в моей базе данных null
уникальный идентификатор.
Итак, где я могу попытаться создать строку CFUUID и быть уверенным, что все контроллеры получат ее вовремя?
РЕДАКТИРОВАТЬ
Идея, которая только что пришла мне в голову. Что если я создам CFUUID внутри функции didFinishLaunchingWithOptions
AppDelegate
?? Если я не ошибаюсь, эта часть кода будет выполняться FIRST раньше всего. Так что проблем с синхронизацией не будет, так как я буду безопасно передавать его везде, где мне это нужно. Верно?