You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Swift:如何无触发动作实现TouchID并在特定页面验证后调用API

How to Implement Auto-Triggered Touch ID Authentication on a Specific iOS Screen (Swift)

Got it, let's break this down exactly how you need it: auto-triggered Touch ID on a specific view controller (no button taps, no viewDidLoad), and an automatic API call right after the user completes Touch ID authorization via the Home button. Here's a practical, Swift-based solution:

Step 1: Import the Required Framework

First, pull in the LocalAuthentication framework to handle biometric checks:

import LocalAuthentication

Step 2: Build the Touch ID Logic in Your Target View Controller

We'll trigger the Touch ID prompt when the view is fully visible (using viewDidAppear instead of viewDidLoad—since you specified avoiding the load phase) and tie the success event directly to your API call. We'll also add safeguards to only run this when the view is active.

Here's the full code for your target view controller:

class TargetViewController: UIViewController {
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // Trigger Touch ID as soon as the user sees this screen
        startTouchIDAuthentication()
    }
    
    private func startTouchIDAuthentication() {
        let authContext = LAContext()
        var authError: NSError?
        
        // Check if Touch ID is supported and set up on the device
        if authContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {
            let promptMessage = "Authenticate to proceed" // Customize this for your use case
            
            authContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: promptMessage) { [weak self] success, error in
                DispatchQueue.main.async {
                    guard let self = self else { return }
                    
                    if success {
                        // Touch ID passed—fire off your API call immediately
                        self.executeTargetAPI()
                    } else {
                        // Handle failure cases (user canceled, wrong fingerprint, etc.)
                        if let error = error {
                            print("Touch ID failed: \(error.localizedDescription)")
                            self.showFailureAlert(message: error.localizedDescription)
                        }
                    }
                }
            }
        } else {
            // Touch ID isn't available (no biometrics set up, unsupported device)
            if let error = authError {
                print("Touch ID unavailable: \(error.localizedDescription)")
                self.showFailureAlert(message: error.localizedDescription)
            }
        }
    }
    
    private func executeTargetAPI() {
        // Replace this with your actual API implementation
        print("Calling API post-Touch ID success!")
        
        // Example URLSession request (adjust to your endpoint and needs):
        guard let apiURL = URL(string: "https://your-api-endpoint.com/authorized-action") else { return }
        let apiTask = URLSession.shared.dataTask(with: apiURL) { data, response, error in
            if let error = error {
                print("API call failed: \(error.localizedDescription)")
                return
            }
            // Process successful response here
            if let responseData = data {
                print("API response: \(String(data: responseData, encoding: .utf8) ?? "No data returned")")
            }
        }
        apiTask.resume()
    }
    
    private func showFailureAlert(message: String) {
        let alert = UIAlertController(title: "Authentication Issue", message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Got it", style: .default))
        present(alert, animated: true)
    }
}

Step 3: Add Background/Foreground Re-Authentication (Optional)

If you want to re-trigger Touch ID when the user returns to this screen from the background (e.g., they locked the phone with Home, then unlocked back to this view), add a notification observer:

Add this to your view controller's viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    // Listen for when the app comes back to the foreground
    NotificationCenter.default.addObserver(self, selector: #selector(handleForegroundReturn), name: UIApplication.willEnterForegroundNotification, object: nil)
}

@objc private func handleForegroundReturn() {
    // Only re-authenticate if this view is still visible
    if isViewLoaded && view.window != nil {
        startTouchIDAuthentication()
    }
}

// Clean up the observer when the view controller is destroyed
deinit {
    NotificationCenter.default.removeObserver(self)
}

Key Details to Keep in Mind:

  • viewDidAppear vs viewDidLoad: Using viewDidAppear ensures the Touch ID prompt only shows when the user is actually looking at the screen, not when the view is just being initialized in the background.
  • Main Thread Safety: All UI updates (like alerts) are wrapped in DispatchQueue.main.async to avoid crashes, since biometric callbacks run on a background thread.
  • Error Handling: We cover cases where Touch ID isn't available or the user fails authentication—make sure to adjust the alerts/messages to fit your app's user experience.

内容的提问来源于stack exchange,提问作者Azeem Usmani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:29:53