Обработчик addUIInterruptionMonitor не вызывается для предупреждения, связанного с фотографиями

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
    }
}

и это не работает для:

введите описание изображения здесь

В начале приложение работает отлично, принимая разрешение на уведомления, но здесь... не работает.

Ты знаешь почему?


person Bartłomiej Semańczyk    schedule 11.10.2016    source источник


Ответы (3)


Добавлять:

app.activate()

в конце метода.

Это снова выведет приложение на передний план (оно будет в фоновом режиме из-за системного предупреждения).

person Bartłomiej Semańczyk    schedule 11.10.2016
comment
или app.swipeUp(), если нажатие может привести к тому, что что-то действительно произойдет в вашем приложении (и вы этого не хотите) - person xaphod; 19.10.2016
comment
Меня устраивает. Это немного странно... вам нужно взаимодействовать с приложением, чтобы обработчик сработал. это где-то задокументировано? - person cornr; 30.11.2017
comment
есть ли радар для этого бага? - person Wladek Surala; 03.01.2018
comment
app.tap() касается середины экрана, что может привести к нежелательным действиям, как указал @xaphod. Если вы также не можете использовать swipeUp(), возможно, вы можете коснуться определенной точки на экране, см. здесь - person Reinhard Männer; 06.02.2018

Я обнаружил, что addUIInterruptionMonitor иногда не обрабатывает предупреждение вовремя или до завершения тестов. Если это не работает, попробуйте использовать Springboard, который управляет домашним экраном iOS. Отсюда вы можете получить доступ к предупреждениям, кнопкам и многому другому, и это особенно полезно для тестов, когда вы точно знаете, когда появится предупреждение.

Итак, что-то вроде этого:

`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" вызывает проблемы).

person Taylor Lindsay    schedule 30.09.2019
comment
addUIInterruptionMonitor работал локально, но на CI не срабатывал для доступа к камере. Это был единственный подход, который, кажется, работал. - person possen; 21.05.2021

После добавления монитора прерываний вы должны продолжать взаимодействовать с приложением, как будто его и не было.

Также обратите внимание, что в идентификаторе кнопки вместо обычного апострофа используется "умная кавычка".

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)
person Oletha    schedule 11.10.2016
comment
Фактическая кнопка имеет символ «умной кавычки» , а не '. Также ваш код выдает ошибку компилятора Значение типа «XCUIElement» не имеет члена «tapWhenExists». - person Aaron Brager; 27.05.2019
comment
@AaronBrager, метод tapWhenExists() - это один из кода вопроса, а не функция стандартной библиотеки. Я предлагаю вам вместо этого использовать tap(), завернутый в чек на exists. - person Oletha; 27.05.2019
comment
Когда произойдет следующее взаимодействие, проголосуйте за это от меня. - person Simon; 28.04.2020
comment
Когда происходит следующее взаимодействие, это действительно ключевой вывод для меня. - person Amresh; 04.02.2021