У меня есть два метода: (1) используется для преобразования OIDAuthState в NSString для хранения в нем. Связка ключей и (2) используются для преобразования NSString из Связки ключей в OIDAuthState. Вот первое:
Код: Выделить всё
NSData *checkEncoding;
- (NSString *)authStateToString:(OIDAuthState *)authState {
NSError *errRet;
//NSData *authStateData = [NSKeyedArchiver archivedDataWithRootObject:authState];
NSData *authStateData = [NSKeyedArchiver archivedDataWithRootObject:authState
requiringSecureCoding:NO error:&errRet];
checkEncoding = authStateData;
NSString *authString = [[NSString alloc] initWithData:authStateData
encoding:NSUnicodeStringEncoding];
NSLog(@"ToString length = %ld, authStateData length = %ld",
(unsigned long)authString.length, (unsigned long)authStateData.length);
return authString;
}
Код: Выделить всё
- (OIDAuthState *)stringToAuthState:(NSString *)authString {
NSError *errRet;
NSData *authStateData = [authString dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:NO];
NSLog(@"ToAuthState length = %ld, authStateData length = %ld, checkEncoding = %d",
(unsigned long)authString.length, (unsigned long)authStateData.length, [authStateData isEqualToData:checkEncoding]);
OIDAuthState *authState = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class]
fromData:authStateData error:&errRet];
//OIDAuthState *authState = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:authStateData error:&errRet];
//OIDAuthState *authState = [NSKeyedUnarchiver unarchiveObjectWithData:authStateData];
/* NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:authStateData];
OIDAuthState *authState = [unarchiver decodeObject];
[unarchiver finishDecoding]; */
return authState;
}
Обратите внимание на утверждения NSLog в каждом из них, которые, кажется, указывают на проблему. Для authStateToString NSLog выходные данные: «Длина ToString = 7930, длина authStateData = 15860». Для stringToAuthState NSLog выходные данные: «Длина ToAuthState = 7930, длина authStateData = 15862, checkEncoding = 0». NSStrings в обоих методах равны в соответствии с isEqualToString.
Итак, я предполагаю, что OIDAuthState не может быть повторно создан, поскольку преобразование для версий NSString происходит, но не восстанавливается то же самое представление NSData; закодированная версия составляет 15860 байт, а декодированная версия – 15862 байта, а isEqualToData возвращает false.
Я отмечаю, что вызывается метод NSKeyedArchiver класса OIDAuthState encodeWithCoder как и ожидалось при кодировании состояния. Соответствующий метод NSKeyedUnarchiver initWithCoder не вызывается, но это неудивительно, поскольку передаваемые NSData, вероятно, недействительны.
Я пробовал несколько dataUsingEncoding типы кодирования с наибольшим количеством ошибок (результирующий NSData имеет нулевую длину). NSUnicodeStringEncoding — единственный, который, похоже, создает экземпляры NSData соответствующей длины. Я пробовал установить для параметра «requireingSecureCoding» значение ДА и НЕТ. Я пробовал установить для параметраallowLossyConversion значение YES и NO.
Я открыт для других методов сохранения OIDAuthState, но кажется, что то, что я сделал, должно быть действительным. Может кто-нибудь подсказать, почему я не могу правильно разархивировать?
Подробнее здесь: https://stackoverflow.com/questions/790 ... dauthstate