【问题标题】:Customize keychain alert actions自定义钥匙串警报操作
【发布时间】:2019-08-07 10:41:38
【问题描述】:

我想知道是否可以自定义钥匙串警报?您可以在下面找到图片:

我想要达到的目标:

当使用 FaceID/TouchID 的身份验证失败并在显示的警报上方弹出时,我希望用户点击输入密码并显示我的自定义应用程序密码 UI,而不是设备密码(系统 ui)。基本上,我想自定义回退操作。

背景: 我知道使用LAContext 是可能的,但是由于我们可以绕过它的原因,我在实现它时感觉不舒服,所以我选择了 Keychain accessControlFlags。

快照代码,我目前拥有的:

func data(forAccount account: String, service: String, accessGroup: String?) throws -> Data? {
    guard let accessControl = createAccessControl(with: .userPresence) else { return nil }
    var query = self.query(forAccount: account, service: service, accessGroup: accessGroup)

    var authContext = LAContext()
    authContext.localizedFallbackTitle = "Enter Passcode"
    authContext.localizedCancelTitle = "Cancel"

    query[KeychainConstants.matchLimit] = KeychainConstants.matchLimitOne
    query[KeychainConstants.returnData] = kCFBooleanTrue
    query[KeychainConstants.authenticationContext] = authContext
    query[KeychainConstants.accessControl] = accessControl

    var result: AnyObject?
    let status = withUnsafeMutablePointer(to: &result) {
        securityItemManager.copyMatching(query, result: UnsafeMutablePointer($0))
    }

    if let error = error(fromStatus: status), error != .itemNotFound  {
        throw error
    }
    guard result != nil else { return nil }
    guard let resultData = result as? Data else { throw AccessError.invalidQueryResult }
    return resultData
}

【问题讨论】:

  • 我的理解是你需要使用 LAContext 后备才能做到这一点。呈现此视图时,用户将始终可以使用生物识别或取消。
  • @iDev 感谢您的回复。在这种情况下如何使用 LAContext 回退,你能说得更具体一点吗?
  • 我会添加更多描述的答案

标签: ios swift keychain


【解决方案1】:

您可以做的唯一自定义是更改对话框按钮标签。您可以使用以下方法执行此操作:

 let context = LAContext()

 context.localizedFallbackTitle = ""
 context.localizedCancelTitle = "Manual connection"

通过将localizedFallbackTitle 属性设置为空字符串来删除回退按钮(输入密码)。

很遗憾,此对话框没有“委托”类型的回调。您需要使用错误来管理用户交互。因此,LAError.userCancel 在用户按下取消按钮时触发,LAError.userFallback 在用户按下后备按钮时触发。

这是一个例子:

let context = LAContext()
context.localizedFallbackTitle = "Facebook"
context.localizedCancelTitle = "Web Connection"

[...]

context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
                       localizedReason: "My reason") { (success, errorOrNil) in

if let error = errorOrNil {

   if success {

      // The evaluation succeeded

   } else {

      if let error = errorOrNil {

         switch error {
             case .userCancel: 

                 // Execute the custom actions you want to do. Here it would be
                 // to start a web login process.
                 self.webLogin()

             case .userFallback: 

                self.fabebookAuthentication() 

             default: 
                 // Other error thrown by the framework.
         }
      }
   }
 }

【讨论】:

  • 感谢您的回复。很遗憾他们还没有实现回调。我知道评估政策是可能的 :)
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多