使用 swiftUI 进行生物特征认证评估 [英] Biometric Authentication evaluation with swiftUI

查看:19
本文介绍了使用 swiftUI 进行生物特征认证评估的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经能够在我的应用程序中使用基本版本的 Face/Touch ID.但是,我想添加更好的回退和错误处理.

I've been able to get a rudimentary version of Face / Touch ID working inside my app. However, I want to add better fallbacks and error handling.

所以我一直在研究如何去做.有很多这样的资源:

So I've been researching how to do it. There are fantastic resources like this:

面容 ID 评估过程无法正常工作

但是,我在 SwiftUI 视图中找不到任何可用的东西.目前我的项目不会运行:

However, I can't find anything that works inside a SwiftUI view. At the moment my project won't run with:

'unowned' may only be applied to class and class-bound protocol types, not 'AuthenticateView'

Value of type 'AuthenticateView' has no member 'present'

任何帮助将不胜感激.谢谢!

any help would be much appreciated. Thank you!

这是我在 AuthenticateView.swift 中的代码

Here's my code inside AuthenticateView.swift

func Authenticate(completion: @escaping ((Bool) -> ())){

    //Create a context
    let authenticationContext = LAContext()
    var error:NSError?

    //Check if device have Biometric sensor
    let isValidSensor : Bool = authenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)

    if isValidSensor {
        //Device have BiometricSensor
        //It Supports TouchID

        authenticationContext.evaluatePolicy(
            .deviceOwnerAuthenticationWithBiometrics,
            localizedReason: "Touch / Face ID authentication",
            reply: { [unowned self] (success, error) -> Void in

                if(success) {
                    // Touch / Face ID recognized success here
                    completion(true)
                } else {
                    //If not recognized then
                    if let error = error {
                        let strMessage = self.errorMessage(errorCode: error._code)
                        if strMessage != ""{
                            self.showAlertWithTitle(title: "Error", message: strMessage)
                        }
                    }
                    completion(false)
                }
        })
    } else {

        let strMessage = self.errorMessage(errorCode: (error?._code)!)
        if strMessage != ""{
            self.showAlertWithTitle(title: "Error", message: strMessage)
        }
    }
}

func errorMessage(errorCode:Int) -> String{

    var strMessage = ""

    switch errorCode {

    case LAError.Code.authenticationFailed.rawValue:
        strMessage = "Authentication Failed"

    case LAError.Code.userCancel.rawValue:
        strMessage = "User Cancel"

    case LAError.Code.systemCancel.rawValue:
        strMessage = "System Cancel"

    case LAError.Code.passcodeNotSet.rawValue:
        strMessage = "Please goto the Settings & Turn On Passcode"

    case LAError.Code.touchIDNotAvailable.rawValue:
        strMessage = "TouchI or FaceID DNot Available"

    case LAError.Code.touchIDNotEnrolled.rawValue:
        strMessage = "TouchID or FaceID Not Enrolled"

    case LAError.Code.touchIDLockout.rawValue:
        strMessage = "TouchID or FaceID Lockout Please goto the Settings & Turn On Passcode"

    case LAError.Code.appCancel.rawValue:
        strMessage = "App Cancel"

    case LAError.Code.invalidContext.rawValue:
        strMessage = "Invalid Context"

    default:
        strMessage = ""

    }
    return strMessage
}

func showAlertWithTitle( title:String, message:String ) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    let actionOk = UIAlertAction(title: "OK", style: .default, handler: nil)
    alert.addAction(actionOk)
    self.present(alert, animated: true, completion: nil)
}

推荐答案

说明:

'unowned' 只能应用于类和类绑定的协议类型,而不是 'AuthenticateView'

'unowned' may only be applied to class and class-bound protocol types, not 'AuthenticateView'

首先,你有 AuthenticateView,它是一个 struct.你不能这样做 class 因为整个 Apple 的 SwiftUI 想法 都是关于结构的. 因为 Struct 是值类型而不是引用类型,所以没有指针.因此,您不能将包含 unowned selfweak self 修饰符的代码部分包含到 struct AuthenticateView: View {}

First of all, you have AuthenticateView which is a struct. You can't do it class because whole Apple's SwiftUI idea is about structures. And because Struct is value type and not a Reference type, so no pointer as such. So you may not include code parts containing unowned self and weak self modifiers into struct AuthenticateView: View {}

'AuthenticateView' 类型的值没有成员 'present'

Value of type 'AuthenticateView' has no member 'present'

present 是一个 UIViewController 的方法.在 SwiftUI 中,您无法访问它.使用下一种样式显示警报:

present is a UIViewController's method. Here in SwiftUI you have no access to it. The alerts are being presented using the next style:

struct ContentView: View {
    @State private var show = false
    var body: some View {
        Button(action: { self.show = true }) { Text("Click") }
        .alert(isPresented: $showingAlert) {
            Alert(title: Text("Title"), 
                message: Text("Message"), 
          dismissButton: .default(Text("Close")))
        }
    }
}

解决办法:对于您的情况,我将为您的逻辑创建 ObservableObjectclass Handler 子类,并使用 @ObservedObject@Published@State.

Solution: For your case, I would create a class Handler subclass of ObservableObject for your logic and use the power of @ObservedObject, @Published and @State.

理解概念的粗略示例:

import SwiftUI

struct ContentView: View {
    @ObservedObject var handler = Handler()
    var body: some View {
        Button(action: { self.handler.toggleShowAlert() }) { Text("Click") }
            .alert(isPresented: $handler.shouldShowAlert) {
                Alert(title: Text(handler.someTitle),
                    message: Text(handler.someMessage),
              dismissButton: .default(Text("Close")))
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class Handler: ObservableObject {
    @Published var shouldShowAlert: Bool = false
    @Published var someTitle = ""
    @Published var someMessage = ""

    func toggleShowAlert() {
        shouldShowAlert.toggle()
        someTitle = "ErrorTitle"
        someMessage = "ErrorMessage"
    }
}

这篇关于使用 swiftUI 进行生物特征认证评估的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆