我在一些touchId应用程序中看到,在SecItemUpdate
上,touchId UI屏幕永远不会弹出,更新仍然会发生。我需要类似我的应用程序的功能,并根据我从Apple开发人员指南中读到的内容(我的理解可能是错误的)提出了一些选项,但它们似乎没有用。这是我到目前为止所做的。
将kSecUseNoAuthenticationUI
设置为YES
,将返回错误代码-25308
。将kSecUseNoAuthenticationUI
设置为NO
,将返回错误代码-50
。如果我不包含kSecUseNoAuthenticationUI
,则会弹出默认的身份验证UI。
NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: @"SampleService",
(__bridge id)kSecUseNoAuthenticationUI: @YES
};
NSDictionary *changes = @{
(__bridge id)kSecValueData: [@"UPDATED_SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding]
};
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSStatus status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)changes);
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_UPDATE_STATUS", nil), [self keychainErrorToString:status]];
[super printResult:self.textView message:msg];
});]
所以我迷失了。感谢您是否可以给我一些关于如何在SecItemUpdate上禁用此touchId UI弹出窗口的指示。感谢
答案 0 :(得分:4)
如果你看一下WWDC 2014 Session 711的视频,那么在31:35左右会提到kSecUseNoAuthenticationUI
。
您也可以查看“SecItem.h”:
@constant kSecUseNoAuthenticationUI Specifies a dictionary key whose value
is a CFBooleanRef. If provided with a value of kCFBooleanTrue, the error
errSecInteractionNotAllowed will be returned if the item is attempting
to authenticate with UI.
我不确定您是否可以禁用弹出窗口并执行更新。
我想要理解的是:设置kSecUseNoAuthenticationUI
选项不会显示弹出窗口。但是,如果您尝试访问需要身份验证的项目,则通过返回errSecInteractionNotAllowed
作为操作结果来指示您该项目将失败
答案 1 :(得分:1)
根据iOS8发行说明,这应该是这种情况,你应该删除并重新添加你的项目
if (status == errSecDuplicateItem) { // exists
status = SecItemDelete((__bridge CFDictionaryRef)attributes);
if (status == errSecSuccess) {
status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
}
}