试图绕过下面:
https://developer.apple.com/videos/play/wwdc2016/225/ 提到sendPayments意图默认为IntentsRestrictedWhileLocked,但是如果我们想要提升安全性以便用户需要使用Touch Id(本地身份验证)进行批准,那么如何做到这一点呢?当设备被锁定/解锁时都需要这样做。我假设扩展程序需要以某种方式在“确认”中显示本地身份验证用户界面。阶段
他们还提到可以增加安全性,但只需要确认,如果这样做的机制只是IntentsRestrictedWhileLocked扩展属性?或者有没有办法指定需要触摸ID身份验证?
答案 0 :(得分:3)
要回答这两个问题,是的,您可以使用Touch ID提高付款的安全性,以下是我在Apple的示例代码here上实现的方式,我将以下函数添加到SendPaymentIntentHandler.swift:
func authenticate(successAuth: @escaping () -> Void, failure: @escaping (NSError?) -> Void) {
// 1. Create a authentication context
let authenticationContext = LAContext()
var error:NSError?
guard authenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
failure(error)
return
}
// 3. Check the fingerprint
authenticationContext.evaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Unlock to send the money",
reply: { [unowned self] (success, error) -> Void in
if( success ) {
successAuth()
}else {
let message = self.errorMessageForLAErrorCode(errorCode: (error! as NSError).code)
print(message)
failure(error! as NSError)
}
})
}
func errorMessageForLAErrorCode( errorCode:Int ) -> String{
var message = ""
switch errorCode {
case LAError.appCancel.rawValue:
message = "Authentication was cancelled by application"
case LAError.authenticationFailed.rawValue:
message = "The user failed to provide valid credentials"
case LAError.invalidContext.rawValue:
message = "The context is invalid"
case LAError.passcodeNotSet.rawValue:
message = "Passcode is not set on the device"
case LAError.systemCancel.rawValue:
message = "Authentication was cancelled by the system"
case LAError.touchIDLockout.rawValue:
message = "Too many failed attempts."
case LAError.touchIDNotAvailable.rawValue:
message = "TouchID is not available on the device"
case LAError.userCancel.rawValue:
message = "The user did cancel"
case LAError.userFallback.rawValue:
message = "The user chose to use the fallback"
default:
message = "Did not find error code on LAError object"
}
return message
}
然后在handle方法中调用函数authenticate,结果是我的应用程序在确认付款后要求Touch ID身份验证,然后在用户验证自己后成功发送付款。
答案 1 :(得分:1)
听起来您期望有一种内置的发送付款扩展方式来调用本地身份验证。就像在plist中指定一个键来说你想要触摸ID身份验证一样?我认为不是这样的。
对于我正在处理的发送付款扩展程序,我们在确认阶段实例化LAContext
,同时调用canEvaluatePolicy(_:error:)
和evaluatePolicy(_:localizedReason:reply:)
。当他们说支持本地身份验证时,我认为他们只是意味着您可以在您的扩展中触发它,并且Siri将显示UI。
答案 2 :(得分:0)
如果在IntentsRestrictedWhileLocked中列出了指定的意图,则在屏幕被锁定时,Siri无法调用它。只有在通过密码或触摸ID解锁设备时才能调用它。据我所知,没有办法区分设备是如何解锁的。