Расширение iOS, добавляющее новую проблему NSUserDefaults после обновления из магазина приложений

Мое приложение имеет авторизацию. Взамен, если я вхожу в систему, я получаю токен, который я храню в NSUserDefaults.

Как работает текущее приложение: Когда я нажимаю кнопку входа в систему, приложение отправляет имя пользователя и логин на сервер, в ответ приложение получает токен в случае успеха.

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

- (void)saveUserWithInfo...{

...

[[NSUserDefaults standardUserDefaults] setObject:token
                                          forKey:kUserToken];

На этом этапе с токеном в приложении все работает отлично.

Для расширения iOS я хочу использовать этот токен, чтобы проверить, вошел ли пользователь в систему или нет. Я добавил следующую строку в метод сохранения пользователя выше:

NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mayapp"];

[sharedDefaults setObject:token
                   forKey:kUserToken];

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

Проблема:

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

После того, как я обновил версию до новой и загрузил ее, я сначала открыл расширение, но оно показало мне ошибку, что пользователь не вошел в систему, что кажется правильным, потому что в общем хранилище NSUserDefaults нет токена. В моем текущем рабочем процессе токен можно сохранить после нажатия кнопки входа. Но после обновления с версии без расширения на версию с расширением из App Store мой пользователь, конечно, все еще вошел в систему для приложения, потому что исходный NSuserDefaults содержит токен, но новый общий NSUserDefaults все еще не получил токен, потому что нам нужно выйти из системы, а затем войти чтобы заставить его работать.

Мой вопрос заключается в том, как установить токен на новый общий NSUserDefaults без выхода из системы, а затем снова войти в систему. Конечно, когда я вхожу в систему, он начинает вызывать все новые строки из обновлений, и есть мой новый общий NSUserDefaults, который я добавил для расширения iOS. Таким образом, после нового входа в систему он будет содержать токен, и если открыть расширение, оно будет работать, но сначала запустите сразу после того, как версия обновления из App Store покажет ошибку, что пользователь не вошел в систему - что правильно из-за нового добавленного shared NSUserDeafults


person Matrosov Alexander    schedule 01.05.2015    source источник


Ответы (1)


Вы действительно должны использовать связку ключей.

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

person Wain    schedule 01.05.2015
comment
да, я думаю, что если приложение переходит на передний план, мы можем проверить его и установить нужный ключ, если он существует. а что вы имеете ввиду про брелок, можете ссылкой поделиться? - person Matrosov Alexander; 01.05.2015
comment
Хранение токенов в пользовательских настройках по умолчанию небезопасно, такая информация должна находиться в цепочке для ключей. - person Wain; 01.05.2015