TouchID with KeyChain - 输入密码屏幕出现格式错误 (Swift)
TouchID with KeyChain - Enter Passcode screen appears malformed (Swift)
我很难接受这个:
我们的应用程序使用 TouchID 从 KeyChain 中检索密钥,这些密钥用于对 WKWebView 中的 WebApp 进行身份验证。当用户成功通过 TouchID 进行身份验证时,一切都很好。
当用户未通过 TouchID 然后点击 "Enter Passcode" 以通过设备密码进行身份验证时,就会出现问题。我注意到显示的屏幕是纯白色的,密码文本框在被屏蔽之前不会显示输入的最后一个字符的值,这造成了一种奇怪的用户体验。这对我来说似乎是一个错误,除非我以某种方式缺少配置要求。
// global arguments for the touchId keychain queries
let kSecClassValue = NSString(format: kSecClass)
let kSecAttrAccountValue = NSString(format: kSecAttrAccount)
let kSecValueDataValue = NSString(format: kSecValueData)
let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)
let kSecAttrServiceValue = NSString(format: kSecAttrService)
let kSecMatchLimitValue = NSString(format: kSecMatchLimit)
let kSecReturnDataValue = NSString(format: kSecReturnData)
let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne)
let kSecAttrAccessControlValue = NSString(format: kSecAttrAccessControl)
let kSecUseOperationPromptValue = NSString(format: kSecUseOperationPrompt)
// set access control
let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, .UserPresence, nil)
// Instantiate a new default keychain query
// Tell the query to return a result
// Limit our results to one item
var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue, "Place your finger to authenticate.", accessControl.takeUnretainedValue()], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue, kSecUseOperationPromptValue, kSecAttrAccessControlValue])
var dataTypeRef :Unmanaged<AnyObject>?
// Search for the keychain item
touchIdStatusCode = SecItemCopyMatching(keychainQuery, &dataTypeRef)
这里是生成的 keychainQuery 字典:
{
"accc" = "<SecAccessControlRef: 0x170621140>";
"acct" = “MY_ACCOUNT”;
"class" = genp;
"m_Limit" = "m_LimitOne";
"r_Data" = 1;
"svce" = “MY_SERVICE”;
"u_OpPrompt" = "Place your finger to authenticate.";
}
此行为存在于最新的 iOS 版本 (8.4) 中。这是我指的屏幕:
我的问题是:我调用 TouchID 的方式是否以某种方式导致屏幕损坏?或者对于这种情况来说这完全正常吗?
谢谢,抱歉冗长 post!
所描述的问题是 Apple 工程师确认的错误。从 iOS 9.0.2.
开始它仍然存在
我很难接受这个:
我们的应用程序使用 TouchID 从 KeyChain 中检索密钥,这些密钥用于对 WKWebView 中的 WebApp 进行身份验证。当用户成功通过 TouchID 进行身份验证时,一切都很好。
当用户未通过 TouchID 然后点击 "Enter Passcode" 以通过设备密码进行身份验证时,就会出现问题。我注意到显示的屏幕是纯白色的,密码文本框在被屏蔽之前不会显示输入的最后一个字符的值,这造成了一种奇怪的用户体验。这对我来说似乎是一个错误,除非我以某种方式缺少配置要求。
// global arguments for the touchId keychain queries
let kSecClassValue = NSString(format: kSecClass)
let kSecAttrAccountValue = NSString(format: kSecAttrAccount)
let kSecValueDataValue = NSString(format: kSecValueData)
let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)
let kSecAttrServiceValue = NSString(format: kSecAttrService)
let kSecMatchLimitValue = NSString(format: kSecMatchLimit)
let kSecReturnDataValue = NSString(format: kSecReturnData)
let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne)
let kSecAttrAccessControlValue = NSString(format: kSecAttrAccessControl)
let kSecUseOperationPromptValue = NSString(format: kSecUseOperationPrompt)
// set access control
let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, .UserPresence, nil)
// Instantiate a new default keychain query
// Tell the query to return a result
// Limit our results to one item
var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue, "Place your finger to authenticate.", accessControl.takeUnretainedValue()], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue, kSecUseOperationPromptValue, kSecAttrAccessControlValue])
var dataTypeRef :Unmanaged<AnyObject>?
// Search for the keychain item
touchIdStatusCode = SecItemCopyMatching(keychainQuery, &dataTypeRef)
这里是生成的 keychainQuery 字典:
{
"accc" = "<SecAccessControlRef: 0x170621140>";
"acct" = “MY_ACCOUNT”;
"class" = genp;
"m_Limit" = "m_LimitOne";
"r_Data" = 1;
"svce" = “MY_SERVICE”;
"u_OpPrompt" = "Place your finger to authenticate.";
}
此行为存在于最新的 iOS 版本 (8.4) 中。这是我指的屏幕:
我的问题是:我调用 TouchID 的方式是否以某种方式导致屏幕损坏?或者对于这种情况来说这完全正常吗?
谢谢,抱歉冗长 post!
所描述的问题是 Apple 工程师确认的错误。从 iOS 9.0.2.
开始它仍然存在