【发布时间】:2014-03-04 21:24:18
【问题描述】:
我一直在使用SSKeychain 开源库将数据安全地存储在我的 iOS 应用程序中。昨天,我遇到了一个问题,当我从 iTunes 将我的应用程序从 v1.0 更新到 v2.0 时,SSKeychain 无法保留其数据。
UUID 生成代码:
- (NSString *)createNewUUID
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return (__bridge NSString *)string;
}
在这里,我生成了一个唯一的设备字符串并使用keychain 来存储它,并且该应用程序在很大程度上依赖于唯一的字符串/设备标识符,因为从 iOS5 到 iOS7,Apple 对@进行了很多转换987654325@,因为这些方法已被弃用。
应对存储和检索的 sn-p:
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 可以在生成时为我提供相同的 deviceID/唯一字符串,因此需要存储唯一字符串?
注意:应用必须支持 iOS 4.3 及更高版本。
【问题讨论】:
-
从概念上讲,keychain 项目在应用升级后是持久化的,所以很可能是使用 SSKeychain 的问题。是升级后就消失一次,还是每次升级后密码都存储失败?您在代码中的哪个位置执行存储和检索?
-
为什么在设置密码时检查“未找到”错误代码?它应该返回一个 BOOL 来判断它是否成功。我也找不到
SSKeychainErrorNotFound的文档,这是您(或其他人)所做的扩展吗? -
我还要检查的是权利文件。确保
keychain-access-groups 在旧 App Store 构建的权利文件和新的权利文件中具有相同的值。 -
Keychain Services Concepts Documentation的第一个注释中提到了对provision profile(在iOS上)的依赖
标签: ios ios5 uniqueidentifier keychain sskeychain