我一直在使用
SSKeychain开源库在我的iOS应用程序中安全地存储数据.昨天,我遇到了一个问题,当我从iTunes将v1.0从v1.0更新到v2.0时,SSKeychain无法保留其数据.
- (NSString *)createNewUUID { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef string = CFUUIDCreateString(NULL,theUUID); CFRelease(theUUID); return (__bridge NSString *)string; }
在这里,我生成了一个独特的设备字符串,并使用钥匙串存储相同的应用程序和应用程序在很大程度上取决于唯一的字符串/设备标识符,因为从iOS5到iOS7,Apple在与唯一设备标识符有关的过程中进行了大量的转换,因为方法已被弃用.
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 /唯一字符串,因此需要存储唯一字符串?
注意:App必须支持iOS 4.3及更高版本.
解决方法
你应该看看
this answer.你现在面临的问题实际上是失去了对你的捆绑种子ID(你的捆绑ID之前的10个符号的字母数字代码)绑定的钥匙串组的访问权限,这是你的团队标识符.因此,基本上,应用更新后访问钥匙串取决于您使用的分发证书,而不是像@ PF1中提到的配置文件.
为了证明我的观点,我建议你尝试以下步骤:
为了证明我的观点,我建议你尝试以下步骤:
>在iTunes Connect中为您的应用添加新版本.>使其“准备上传”.>在会员中心向自己发放新的分发证书.>创建两个新的appstore配置文件 – 一个包含您的旧/第二个新证书.>创建两个档案,就像您通常所做的那样将应用程序提交到App Store – 一个带有旧/秒的新证书.>验证两者.具有新证书的证书将提供验证警告,即此版本将丢失对钥匙串组的访问权限.