长期读者,第一次作家.感谢一个伟大的社区.
我正在开发的应用程序已经实现了应用内购买并且运行良好,但是我遇到了一个奇怪的错误情况,我没有看到明显的解决方案.可以在购买时使用Touch ID的iPhone 5S上看到该场景.当用户选择要购买的项目时,将弹出Touch ID对话框.如果用户取消这个特定的对话框中,SKPayment委托收到一个SKPaymentTransactionStateFailed
与事件SKErrorUnknown
代码- 不 SKErrorPaymentCancelled
为人们所期望的,当我取消密码输入对话框收到什么.由于代码无法将此分类为用户取消购买,因此用户将看到一般错误警报视图.我不认为这是一个沙盒问题,因为购买本身在沙箱和现场测试都很有效.
关于如何将未知错误检测为取消的想法,任何人?
我有一个AVCaptureDevice
在屏幕上显示实时相机预览.
当触摸ID视图覆盖在相机预览上时(使用CAContext
's' evaluatePolicy
),相机预览会冻结.取消触摸ID视图后,相机预览会在重新启动前闪烁黑屏.
冷冻和黑屏闪光都是有问题的.如何在Touch ID视图覆盖的情况下保持相机预览活动?
我正在使用代码创建本机触摸 ID 警报:
let context = LAContext()
guard deviceCanUseTouchId(context: context) else {
return
}
presentingAlert = true
[context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "touch_id_auth_message".localized(), reply: { [unowned self] success, error -> Void in
self.presentingAlert = false
self.canPresentAlert = true
dispatch_async(dispatch_get_main_queue()) {
completionHandler?(success)
}
})]
Run Code Online (Sandbox Code Playgroud)
调用本机 Touch ID 警报的按钮处理程序如下所示:
@IBAction func touchUpInsideUseTouchIdButton(sender: AnyObject) {
ACTouchId.sharedManager.authenticateWithTouchId(completionHandler: { [weak self] in
self?.handleTouchIdAuthentication(granted: $0)
})
view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)
这是handleTouchIdAuthentication的代码:
private func handleTouchIdAuthentication(granted granted: Bool) {
if granted {
//...
} else {
passcodeDigitTextField1.becomeFirstResponder()
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,大多数时候,当我取消 Touch ID 本机对话框时,警报会正确关闭,并变为FirstResponder() …
我正在使用StoreKit处理应用内购买,这非常有效.我
在网上找不到解决方案的唯一问题是:在尝试进行IAP的其他应用程序中,我被要求使用Touch ID(所以这不是我的设备设置错误等),而在我的应用程序中它始终要求用于密码.如何使用Touch ID进行iTunes身份验证?先感谢您!
我想使用TouchID验证我的应用程序,验证成功.如果TouchID不匹配,则会打开"再试一次"警报,并在该警报中输入"密码"选项.如果用户选择该选项,则应显示系统密码验证,但我该怎么办呢?
在这里分享我的代码:
func touchIDAuthentication() {
let context = LAContext() //1
var error:NSError?
guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
showAlertViewIfNoBiometricSensorHasBeenDetected()
return
}
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &errorPointer) {
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: { (success, error) in
if success {
DispatchQueue.main.async {
print("Authentication was successful")
}
}else {
DispatchQueue.main.async {
self.displayErrorMessage(error: error as! LAError )
print("Authentication was error")
}
}
})
}else {
self.showAlertWith(title: "Error", message: (errorPointer?.localizedDescription)!)
}
}
func displayErrorMessage(error:LAError) {
var message = ""
switch error.code {
case LAError.authenticationFailed:
message = …
Run Code Online (Sandbox Code Playgroud) 如果设备支持Face ID或Touch ID,我想对用户采取不同的操作.
使用Face ID时,iOS要求使用权限.(与Touch ID不同).
如果用户拒绝权限,则context.biometryType返回LABiometryTypeNone.
无论如何都要检查设备支持的Touch ID或Face ID.
LAContext *context = [[LAContext alloc] init];
NSError *error;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
}
if (@available(iOS 11.0, *)) {
if (context.biometryType == LABiometryTypeFaceID) {
// support FaceID
}
}
// support TouchID
Run Code Online (Sandbox Code Playgroud)
控制台输出
(lldb) po error
Error Domain=com.apple.LocalAuthentication Code=-6 "User has denied the use of biometry for this app." UserInfo={NSLocalizedDescription=User has denied the use of biometry for this …
Run Code Online (Sandbox Code Playgroud) 所以我想进行touchid
身份验证,但如果touchid
不匹配,则会提示输入密码并重试
我正在使用 XCode 9.0.0
@IBAction func ac(_ sender: Any) {
let context:LAContext=LAContext()
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil){
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "use your touch id", reply: {(wasCorrect,error) in
if wasCorrect {
print("correct")
}else{
print("incorrect")
}
})
}else{
}
}
Run Code Online (Sandbox Code Playgroud) 我只是按照本教程通过面容 ID 对用户进行身份验证,但实际上在身份验证失败后,它不适用于“再次尝试面容 ID”按钮,没有调用回调,我不知道为什么。这是代码:
@IBAction func touchIdAction(_ sender: UIButton) {
print("hello there!.. You have clicked the touch ID")
let myContext = LAContext()
let myLocalizedReasonString = "Biometric Authntication testing !! "
var authError: NSError?
if #available(iOS 8.0, macOS 10.12.1, *) {
if myContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {
myContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: myLocalizedReasonString) { success, evaluateError in
DispatchQueue.main.async {
if success {
// User authenticated successfully, take appropriate action
self.successLabel.text = "Awesome!!... User authenticated successfully"
} else {
// User did not authenticate successfully, look …
Run Code Online (Sandbox Code Playgroud) 如果这个话题不适合 Stackoverflow,我提前道歉(我要求版主在适当的地方移动它)。谢谢。
我想知道应用程序如何使用 Touch ID 或 Face ID 来验证身份而不将生物识别数据存储到他们的服务器中。
没有 Touch/Face ID 的身份验证(此处过于简化)
在用户允许应用使用他们的 Touch/Face ID 之后...
使用 Touch/Face ID 进行身份验证
……这里发生了什么?发送到服务器要验证的内容是什么?
我读到生物识别数据存储在手机上的安全芯片中,而不存储在任何服务器上。
对于 iOS,除了 Touch/Face ID 包之外,我们还需要使用钥匙串访问。为什么?这里存储了什么?
谢谢你。
我正在开发一个在开头使用 Face/Touch ID 的应用程序。我通过将此 func 添加到我的 MainViewController() 来实现此目的:
let context = LAContext()
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil) {
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Verifying") { (success, err) in
if success {
DispatchQueue.main.async {
self.loginSuccessfull()
self.button.removeFromSuperview()
}
} else {
if let err = err {
print(err)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这在 ViewDidLoad 和按钮中都会被调用,如本视频所示。
正如你所看到的,当我尝试关闭我的应用程序时,它有一个非常奇怪的行为,我确定这是由 FaceID 引起的。
有什么建议可以解决这个问题吗?
崩溃日志:
Error Domain=com.apple.LocalAuthentication Code=-4 "Caller moved to background." UserInfo={NSLocalizedDescription=Caller moved to background.}
Run Code Online (Sandbox Code Playgroud)