ios 未针对与照片相关的警报调用addUIInterruptionMonitor的处理程序

xurqigkl  于 2022-12-15  发布在  iOS
关注(0)|答案(3)|浏览(134)
private func acceptPermissionAlert() {

    _ = addUIInterruptionMonitor(withDescription: "") { alert -> Bool in

        if alert.buttons["Don’t Allow"].exists { //doesnt get here second time

            alert.buttons.element(boundBy: 1).tapWhenExists()

            return true
        }

        return false
    }
}

这对以下情况不起作用:

在应用程序的开始,它的工作完美,同时接受通知权限,但在这里...不工作。
你知道为什么吗?

uelo1irk

uelo1irk1#

I'vs发现addUIInterruptionMonitor有时候不能及时处理提醒,或者直到测试完成。如果它不起作用,可以尝试使用管理iOS主屏幕的Springboard。你可以从那里访问提醒、按钮和更多内容,这对于你确切知道何时会显示提醒的测试特别有用。
所以,事情是这样的:

let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") 

let alertAllowButton = springboard.buttons.element(boundBy: 1)
if alertAllowButton.waitForExistence(timeout: 5) {
   alertAllowButton.tap()
}

buttons.element(boundBy:1)将确保您点击右侧的按钮,将1更改为0以点击左侧,(因为有时"Don't Allow"中的“会导致问题)。

hjzp0vay

hjzp0vay2#

增加:

app.tap()

在该方法结束时。
这是因为您需要与应用交互才能触发处理程序。

oyt4ldly

oyt4ldly3#

添加中断监视器后,您应该继续与应用交互,就像它没有出现一样。

  • 还请注意,您的按钮标识符中有一个“智能引号”,而不是常规的撇号。*
let photosAlertHandler = addUIInterruptionMonitor(withDescription: "Photo Permissions") { alert -> Bool in
    if alert.buttons["Don't Allow"].exists {
        alert.buttons.element(boundBy: 1).tapWhenExists()
        return true
    }
    return false
}

// Do whatever you want to do after dismissing the alert
let someButton = app.buttons["someButton"]
someButton.tap() // The interruption monitor's handler will be invoked if the alert is present

当警报出现后发生下一次交互时,中断监视器的处理程序将被调用,警报将被处理。
当您认为已经完成中断监视器时,还应该将其删除,否则它将被任何其他出现的警报调用。

removeUIInterruptionMonitor(photosAlertHandler)

相关问题