我有这个代码从密钥链中获取给定用户名NSString的密码:
NSError *error = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error];
if(error != nil)
// log the error
Run Code Online (Sandbox Code Playgroud)
对于大多数用户来说,这一切都可以正常工作 - 但是对于某些特定用户来说,这个调用似乎失败了(并且继续失败),它返回以下错误:
The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)
Run Code Online (Sandbox Code Playgroud)
这显然是errSecInteractionNotAllowed - 从我读过的内容来看,我认为这意味着要访问钥匙串需要某种用户交互.
有没有人知道为什么这个电话可能只对某些特定用户失败?此钥匙串条目特定于我的应用程序 - 那么为什么需要任何用户交互才能访问它?
任何指针都非常赞赏......
我想知道是否有人使用SFHFKeychainUtils设法修改它们以兼容ARC.更确切地说
NSDictionary *attributeResult = NULL;
NSMutableDictionary *attributeQuery = [query mutableCopy];
[attributeQuery setObject: (id) kCFBooleanTrue forKey:(__bridge id) kSecReturnAttributes];
OSStatus status = SecItemCopyMatching((CFDictionaryRef) attributeQuery,(CFTypeRef *)(attributeResult));
Run Code Online (Sandbox Code Playgroud)
我试过了
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery,(CFTypeRef *)(attributeResult));
Run Code Online (Sandbox Code Playgroud)
也
CFTypeRef subAttributeResult = (CFTypeRef *)(objc_unretainedPointer(attributeResult));
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery,(CFTypeRef *)(subAttributeResult));
Run Code Online (Sandbox Code Playgroud)
这2个是我设法得到的唯一两种方法没有错误.通过在这里添加objc_XXX而不是CFTypeRef来实现任何其他方法并且在那里得到错误(从ARC中禁止从obj-c指针到CFTypeRef的隐式转换,将x参数传递给y参数丢弃限定符).显然,第一段代码也会出错.虽然构建时没有出现任何错误,但在到达此部分代码时,应用程序会因EXC_BAD_ACCESS而崩溃.
完整SFHFKeychainUtils的链接:https://github.com/ldandersen/scifihifi-iphone/tree/master/security
有什么帮助吗?谢谢.
iphone keychain ios automatic-ref-counting sfhfkeychainutils
我现在用SFHFKeychainUtils了一段时间.在我上次更新到AppStore时,它突然"忘记"了我的用户密码.这意味着,当调用getPasswordForUsername相同的用户名和服务时,它现在不会返回结果.我不打印错误变量,所以我不知道它是否返回任何东西,我只知道它不会返回密码/任何字符串.我已经尝试通过安装旧版本然后在其上安装新版本来重现我的设备/其他调试设备上的问题,但它没有发生!工作得很好.我知道它有点模糊,但我真的不明白它来自哪里所以我无法提供更多信息.任何人都知道是什么原因引起的?在这方面你有什么最佳实践我可能会失踪吗?或者只是提示我如何调试此问题?
非常感谢!
我正在使用SFHFKeychainUtils在我的应用程序中使用Keychain服务.我写了一些OCUnit测试来验证这段代码的功能.当我在iOS模拟器或我的设备上运行Xcode的单元测试时,一切正常.但是现在我正在尝试设置CI服务器,并且当它通过命令行运行时测试失败,错误代码为-25291.仔细查看Apple的文档告诉我:没有可用的信任结果(errSecNotAvailable).我已将Security.framework链接到我的单元测试项目,看起来就像我在网上看到的那样,这是我需要的才能让它工作.这是我在控制台中调用的命令:
/usr/bin/xcodebuild -target [Test_Target] -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/ -configuration Debug
有没有人有任何经验或建议让单元测试和钥匙串服务从命令行很好地一起玩?
continuous-integration unit-testing ocunit ios sfhfkeychainutils