2014-02-07 3 views
6

Я использовал SSKeychain библиотеку с открытым исходным кодом для безопасного хранения данных в приложении iOS. Вчера я столкнулся с проблемой, SSKeychain не смог сохранить свои данные, когда я обновлял свое приложение с версии 1.0 до версии 2.0 из iTunes.Keychain не сохраняет данные после того, как приложение получает обновление от iTunes

Код для UUID поколения:

- (NSString *)createNewUUID 
{ 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    return (__bridge NSString *)string; 
} 

Здесь, я создал уникальную строку устройства и использовать keychain хранить то же самое, и приложение сильно зависит от уникального идентификатора строки/устройства, так как от iOS5 к iOS7 существует множество преобразований, сделанных Apple в отношении Unique Device Identifier, поскольку методы стали устаревшими.

Справиться сниппет для магазина & Retrive:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.name.appname" account:@"AppName"]; 
if (retrieveuuid == nil) { 
    NSString *uuid = [self createNewUUID]; 

    //Store the password in Keychain 
    NSError *error = nil; 
    [SSKeychain setPassword:uuid forService:@"com.name.appname" account:@"AppName" error:&error]; 

    if ([error code] == SSKeychainErrorNotFound) { 
     NSLog(@"ID not found"); 
    } 
} 

Итак, это то, что брелок не сможет сохранить свои ценности/идентификатор, когда приложение обновляется от Apple, или мне не хватает в какой-то момент. Пожалуйста, помогите, если его можно постоянно хранить Идентификатор на устройстве, не относящийся к установке, деинсталляции, перезагрузке и обновлению приложения.

В качестве альтернативы, есть ли какой-либо API, который может предоставить мне ту же самую идентификатор устройства/уникальную строку при ее создании, поэтому вам нужно сохранить уникальную строку?

Примечание: Приложение должно поддерживать iOS 4.3 и выше.

+3

Концептуально брелка элементы сохранялись после обновления приложения, так что это, вероятно, будет ошибка в использовании SSKeychain. Он просто исчезает один раз после обновления, или пароль не будет сохраняться каждый раз после обновления? Где в коде вы выполняете Store & Retrieve? – WDUK

+1

Почему вы проверяете код ошибки «NotFound» при настройке пароля? Он должен вернуть BOOL для успеха или нет. Я также не могу найти документацию для 'SSKeychainErrorNotFound', это расширение, которое вы (или кто-то еще) сделали? – WDUK

+1

Что я должен проверить, это файл с правами. Удостоверьтесь, что групп ключей-ключей имеет такое же значение как в файле прав старой версии App Store, так и в новом. – almas

ответ

1

Для всех, кто сталкивается с подобной проблемой, я столкнулся с этой проблемой при локальном тестировании и попытке выполнить ручное обновление приложения. Я попытался переписать версию на своем устройстве (с профилем App Store) с моей локальной копией из Xcode (с профилем Profile Provisioning Profile). Как отмечалось в комментариях к almas, кажется, что брелок привязан к профилю подготовки, который используется для сборки. Когда я отправил Apple и обновил свое приложение, SSKeychain работал отлично.

0

Насколько я помню, у нас была проблема simimalar, связанная с тем, что профиль подготовки также изменился. Просто намек. +1 до PF1

3

Вы должны взглянуть на this answer. Проблема, с которой вы сталкиваетесь сейчас, - это фактически потеря доступа к группе ключей, привязанной к вашему идентификатору семени пакета (10-символьный алфавитно-цифровой код до вашего идентификатора пакета), который является вашим идентификатором вашей команды. Таким образом, доступ к keychain после обновлений приложений зависит от используемого вами сертификата распространения, а не от профиля предоставления, такого как @ PF1.
Чтобы доказать свою точку зрения я предлагаю вам попробовать следующие шаги:

  1. Добавить новую версию своего приложения в ITunes Connect.
  2. Сделайте его «готовым к загрузке».
  3. Выдать новый сертификат распределения себе в центр участника.
  4. Создайте два новых профили обеспечения AppStore - один со старым/вторым с новым сертификатом.
  5. Создайте два архива, как обычно, чтобы отправить приложение в App Store - один со старым/вторым с новым сертификатом.
  6. Подтвердите оба.Тот, у кого новый сертификат, даст предупреждение о том, что доступ к группам ключей будет потерян для этой версии.
+0

Мои проблемы в том, что значение cetificate для распространения, которое я использовал для загрузки приложения в магазин приложений, истекло, и я должен запросить новый сертификат для обновления приложение. что я могу сделать сейчас? – user3687

+0

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

+0

Дело в том, что я только что создал AdHoc .ipa и его идентификатор пакета точно такой же, как тот, который я использовал для загрузки версии магазина приложений. Но когда я устанавливаю приложение поверх версии хранилища версии приложения, сбрасывается. – user3687

1

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

enter image description here

enter image description here