如何在Swift中添加解锁屏幕或使用带有安全性的TouchID?

时间:2014-11-13 15:37:25

标签: xcode swift ios8

我使用此代码安全性在我的应用中添加解锁屏幕:

 self.keyChainQuery = [
        kSecClass              : kSecClassGenericPassword,
        kSecAttrService        : serviceIdentifier,
        kSecAttrAccount        : accountName,
        kSecMatchLimit         : kSecMatchLimitOne]
  var extractedData: Unmanaged<AnyObject>? = nil

  let status = SecItemCopyMatching(self.keyChainQuery, &extractedData)

如果设备有解锁码,请使用此解锁码。如果设备具有TouchID,则会检测到TouchID。

如何在TouchID和PassCode之间设置我想要使用的类型?

谢谢!

1 个答案:

答案 0 :(得分:2)

TouchID和设备密码彼此非常不同。 TouchID实际上只是一种更方便的方式来验证用户,而无需他们输入密码。此密码与解锁设备时使用的密码不同,而是解锁应用程序的密码。这意味着如果您的应用程序中已经包含某种类型的身份验证系统,则可以添加TouchID以防止用户每次都手动登录。

另一方面,钥匙串是用于存储敏感信息的内容(如用户登录凭据)。在Keychain中,您可以指定钥匙串项目的安全级别(Read more here)。一个例子是kSecAttrAccessibleAfterFirstUnlock常量,这意味着只有在用户解锁后才允许您提取钥匙串信息。对于那些在iOS 7之后实现后台通知的开发人员来说,这是一个很大的问题,并注意到当设备重新启动但尚未解锁时,他们无法再将凭据发送到服务器。

要使用touchID,您需要一个LAContext的实例:

let context = LAContext()
if( context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics ,error:nil) {        
    //go ahead with TouchID
} else {
   //log in the user with the login UI
}

不要忘记,如果您支持iOS 7.1或更低版本的部署目标,则需要添加适当的可用性检查(应由编译器推断):

if #available(iOS 8.0, *) {
    //it is safe to use touchID
    let context = LAContext()
}

如需更多信息,请尝试this tutorial