Синхронизация при реализации push, iOS

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

Я разрабатываю приложение, которое в основном делает 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 раньше всего. Так что проблем с синхронизацией не будет, так как я буду безопасно передавать его везде, где мне это нужно. Верно?


person DonP    schedule 09.05.2013    source источник
comment
Кажется, вы уже ответили на свой вопрос.   -  person Eran    schedule 09.05.2013
comment
Итак, моя последняя мысль верна, Эран :D ? Ну, иногда, записывая проблему, я думаю, вы лучше думаете :p   -  person DonP    schedule 09.05.2013
comment
Да вы правы.   -  person Eran    schedule 09.05.2013
comment
Вы можете предоставить его в качестве ответа, если хотите, и я приму его. Большое тебе спасибо!!   -  person DonP    schedule 09.05.2013


Ответы (1)


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

Если вы создадите CFUUID в начале этого метода, до регистрации для получения push-уведомлений, он будет иметь значение, когда вы получите токен устройства от Apple (когда вызывается didRegisterForRemoteNotificationsWithDeviceToken), и он будет иметь значение к тому времени, когда вы откроете свой webView.

person Eran    schedule 09.05.2013