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

寻求XCTest/XCUITest中FaceID自动化的Swift官方/更新方案

XCTest/XCUITest 实现FaceID录入与匹配自动化(Swift)

前提说明

XCUITest本身不直接提供FaceID录入的官方API,但可以通过模拟系统设置的交互流程完成录入;人脸匹配验证则可通过处理系统权限弹窗、模拟验证结果实现。以下是基于Swift的具体实现方案,适配模拟器与真机环境。


1. FaceID录入自动化

FaceID录入属于系统设置流程,需通过XCUITest导航至「设置」应用完成操作:

import XCTest

class FaceIDSetupTests: XCTestCase {
    let settingsApp = XCUIApplication(bundleIdentifier: "com.apple.Preferences")
    let testApp = XCUIApplication(bundleIdentifier: "your.app.bundle.id") // 替换为你的应用Bundle ID
    
    override func setUpWithError() throws {
        continueAfterFailure = false
        settingsApp.launch()
    }
    
    func testFaceIDEnrollment() throws {
        // 导航至FaceID与密码设置
        settingsApp.tables.cells["Face ID 与密码"].tap()
        
        // 输入设备密码(替换为你的测试设备密码)
        let passwordTextField = settingsApp.secureTextFields.firstMatch
        passwordTextField.typeText("123456")
        settingsApp.buttons["完成"].tap()
        
        // 开始录入FaceID
        if settingsApp.buttons["设置 Face ID"].exists {
            settingsApp.buttons["设置 Face ID"].tap()
        }
        
        // 模拟人脸扫描流程(模拟器用⌘+⇧+R触发扫描,真机需手动配合)
        XCTContext.runActivity(named: "完成人脸扫描") { _ in
            let firstScanPrompt = settingsApp.staticTexts["将面部置于取景框内"]
            XCTAssertTrue(firstScanPrompt.waitForExistence(timeout: 10))
            
            // 模拟器触发首次扫描
            XCUIDevice.shared.press(.home)
            
            let secondScanPrompt = settingsApp.staticTexts["缓慢转动头部"]
            XCTAssertTrue(secondScanPrompt.waitForExistence(timeout: 10))
            
            // 完成二次扫描
            XCUIDevice.shared.press(.home)
            settingsApp.buttons["完成"].tap()
        }
    }
}

注意事项

  • 模拟器需提前在「设置 > FaceID与密码」中开启FaceID选项;
  • 真机测试时,需确保设备已解锁且允许自动化操作。

2. 应用登录流程自动化

启动目标应用,触发登录入口,并处理FaceID权限请求:

func testAppLoginWithFaceID() throws {
    testApp.launch()
    
    // 触发登录按钮
    testApp.buttons["登录"].tap()
    
    // 处理首次FaceID权限请求弹窗
    let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    if springboard.alerts["“你的应用名称”想要使用Face ID"].exists {
        springboard.buttons["允许"].tap()
    }
    
    // 等待FaceID验证界面加载
    let faceIDPrompt = testApp.staticTexts["使用Face ID登录"]
    XCTAssertTrue(faceIDPrompt.waitForExistence(timeout: 5))
}

3. FaceID人脸匹配自动化

模拟FaceID验证的成功/失败场景,通过系统弹窗交互实现:

func testFaceIDAuthenticationSuccess() throws {
    testApp.launch()
    testApp.buttons["登录"].tap()
    
    // 等待系统FaceID验证弹窗
    let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    let faceIDAlert = springboard.alerts.firstMatch
    XCTAssertTrue(faceIDAlert.waitForExistence(timeout: 5))
    
    // 模拟验证成功(模拟器点击「通过」,真机需配合硬件)
    if faceIDAlert.buttons["通过"].exists {
        faceIDAlert.buttons["通过"].tap()
    }
    
    // 验证登录成功状态
    let welcomeLabel = testApp.staticTexts["欢迎回来"]
    XCTAssertTrue(welcomeLabel.waitForExistence(timeout: 5))
}

func testFaceIDAuthenticationFailure() throws {
    testApp.launch()
    testApp.buttons["登录"].tap()
    
    let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    let faceIDAlert = springboard.alerts.firstMatch
    XCTAssertTrue(faceIDAlert.waitForExistence(timeout: 5))
    
    // 模拟验证失败
    if faceIDAlert.buttons["不通过"].exists {
        faceIDAlert.buttons["不通过"].tap()
    }
    
    // 验证失败提示
    let errorLabel = testApp.staticTexts["FaceID验证失败,请重试"]
    XCTAssertTrue(errorLabel.waitForExistence(timeout: 5))
}

关键提示

  • 模拟器中FaceID验证弹窗按钮为「通过」/「不通过」,真机按钮文本可能不同,需根据实际调整;
  • 批量测试可在setUp方法中提前配置应用权限,避免重复处理弹窗。

内容的提问来源于stack exchange,提问作者Maximiliano alves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:32:37