首先,我观看了WWDC 2013关于用钥匙链保护秘密的会议.我想做一个基本的密码存储.观看了整个视频,但在视频的前10分钟内找到了我需要的内容.这似乎很简单,但我并不完全理解数据编码和检索的工作原理.
问题:在secItemCopyMatching之后,我检查我的NSData对象以确保它在转换为NSString之前不是nil.问题是,它始终是零.下面是我如何保存钥匙串条目或更新,然后是我如何检索它.任何帮助和解释将非常感谢.
更新(已编辑):Fruity Geek,感谢您的回复.我使用__bridge更新了下面的代码.我的问题现在归结为,我是否正确存储和检索密码?我有错还是只有一个或另一个?我的NSData实例总是为零.我正在检查返回代码和我的SecItemAdd和SecItemUpdate(当存在keychaing条目时)正常工作.我似乎无法检索存储的数据(密码)的字符串值,以将其与用户输入的密码进行比较.欣赏帮助家伙和女孩.这是我现在正在做的事情:
更新#2 :(使用Fruity Geek的答案和最终工作版本编辑.我的编辑仅包括对以下代码的更改.)
设置钥匙串条目:
NSData *secret = [_backupPassword dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: twServiceName,
(__bridge id)kSecAttrAccount: twAccountName,
(__bridge id)kSecValueData: secret,
};
OSStatus status =
SecItemAdd((__bridge CFDictionaryRef)query, NULL);
if (status == errSecDuplicateItem) {
// this item exists in the keychain already, update it
query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: twServiceName,
(__bridge id)kSecAttrAccount: twAccountName,
};
NSDictionary *changes = @{
(__bridge id)kSecValueData: secret,
};
status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge …Run Code Online (Sandbox Code Playgroud) 目标是为 Swift 包托管 git 存储库,以将专有代码作为 XCFramework 中的二进制文件分发。源代码依赖于其他 Swift 包。在 .package 配置中列出依赖项是不够的。简单地要求消费者导入依赖项并不是一个选择,因为他们可能在不同级别使用相同的包。我试图解决的主要问题是当我的 Swift Package 导入到项目中时如何解决这些依赖关系。
我正在使用的包也可以在 CocoaPod 中找到。
我已经浏览了以下资源和 SO 帖子,但找不到此特定目的的答案。
我开发了我的第一个应用程序,仍在学习 刚刚更新了Xcode 5,我的iPhone 5正在运行iOS 7.1.我现在正致力于理解"仪器"工具来分析我的应用程序.我正在使用仪器中的泄漏配置文件,并且遇到了一个我无法弄清楚的保留周期和泄漏.感谢我能理解的任何帮助a)如何查明错误和b)我做错了什么以及如何在将来避免它.
在我的应用程序中,我正在使用相机拍摄照片.当相机启动时,我轻触屏幕进行对焦,这时我注意到仪器中出现了泄漏.看起来我的代码中没有保留周期(如果我理解正确)和我的代码中的根漏洞,我不明白.
我正在使用ARC,所以我不应该在我指向我的代码部分中发布"picker"(下面的第2部分,带代码).


Run Code Online (Sandbox Code Playgroud)- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *pickerImage = [info objectForKey: UIImagePickerControllerOriginalImage]; _imageView.image = pickerImage; [picker dismissViewControllerAnimated:YES completion:nil]; // <--- mem-leak }
编辑 - 我创建我的UIImagePickerController的代码.
Run Code Online (Sandbox Code Playgroud)- (IBAction)snapPicture:(id)sender { UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; // If the camera button was tapped AND we have a camera, use it... if ((sender == _cameraButton) && [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; } else { [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; } imagePicker.delegate = …