我发现了使用APNS和可可的真棒解释。 APNS Pusher 现在我不想每次选择我的SecIdentityRef(因为我很懒)我试着把SecIdentityRef放到NSData中并保存到默认值。下一次应用程序启动时,我再次加载它,它总是得到exc_bad_access。这里是我添加的代码:将SecIdentityRef存储到NSUserDefaults
// For saving
NSData *secRefData = [NSData dataWithBytes:[SFChooseIdentityPanel sharedChooseIdentityPanel].identity length:sizeof([SFChooseIdentityPanel sharedChooseIdentityPanel].identity)];
[[NSUserDefaults standardUserDefaults] setValue:secRefData forKey:@"identity"];
//For loading
NSData *secRefData = [[NSUserDefaults standardUserDefaults] valueForKey:@"identity"];
if([secRefData length] != 0) {
[[APNS sharedAPNS] setIdentity:(SecIdentityRef)CFRetain([secRefData bytes])];
}
我如何得到这个工作?有另外一种方法可以存储身份吗?
编辑
所以我发现保存标识的名称,并开始它看起来应用程序可用的身份拥有这个名字,并使用一个具有正确的名称时的解决方案。这里的代码:
//For loading
NSString *lastIdentityName = [[NSUserDefaults standardUserDefaults] valueForKey:@"identityName"];
if([lastIdentityName length] != 0) {
NSArray *allIdentities = [self identities];
for (id object in allIdentities) {
NSString *theName = [[[X509Certificate extractCertDictFromIdentity:(SecIdentityRef)object] valueForKey:@"Subject"] objectForKey:@"CommonName"];
if([theName isEqualToString:lastIdentityName]) {
[[APNS sharedAPNS] setIdentity:(SecIdentityRef)CFRetain((__bridge_retained SecIdentityRef)object)];
[[NSUserDefaults standardUserDefaults] setValue:[self identityName] forKey:@"identityName"];
// KVO trigger
[self willChangeValueForKey:@"identityName"];
[self didChangeValueForKey:@"identityName"];
}
}
}
//For saving
[[NSUserDefaults standardUserDefaults] setValue:[self identityName] forKey:@"identityName"];
非常感谢。但我如何正确存储选定的身份? – thomasguenzel 2012-04-13 12:09:53
我不确定。我看到'SecIdentityCopyCertificate()'和'SecCertificateCopyData()',然后在另一个方向'SecCertificateCreateWithData()'和'SecIdentityCreateWithCertificate()'。但是,我对这些东西并不十分熟悉,我不确定是否会通过将证书数据保存为用户默认值来破坏安全性。 'SecIdentityCopyCertificate()'的文档也表示可以将输出转换为'SecKeychainItemRef'并且我看到'SecKeychainItemCreatePersistentReference()',这看起来很有前途。然后,反过来,'SecKeychainItemCopyFromPersistentReference()'。 – 2012-04-13 12:40:16