'addUIInterruptionMonitor() not working on device running iOS 14.0.1

Since upgrading my device (iPhone 11) to iOS 14.0.1, I have found addUIInterruptionMonitor() to not be triggered at all. It was working before on iOS 13.4.1, which was the last version I had installed.

My code:

addUIInterruptionMonitor(withDescription: "App Would Like to Send You Notifications") { (alert) -> Bool in
    if alert.buttons["Allow"].exists {
        alert.buttons["Allow"].tap()
        return true
    }
    return false
}

XCUIApplication().tap()  // interacting with the app to trigger the interruption monitor

Nothing in my code has changed since upgrading - the only thing that has changed is the iOS version installed. Has anyone else encountered similar?



Solution 1:[1]

I've got it working with this code:

XCUIApplication.otherElements.firstMatch.swipeLeft()

or

app.otherElements.firstMatch.swipeLeft()

The solution was to use the otherElements.firstMatch. Somehow there where only otherElements inside the XCUIApplication view hierarchy. You can use tap-event or the swipe-event. I find the swipe-event least destructive for the UITest state.

Solution 2:[2]

I resolved it by just sleep the execution 10s.

Darwin.sleep(10)
addUIInterruptionMonitor(withDescription: "App Would Like to Send You Notifications") { (alert) -> Bool in
    if alert.buttons["Allow"].exists {
        alert.buttons["Allow"].tap()
        return true
    }
    return false
}

XCUIApplication().tap()

Solution 3:[3]

First of all I would suggest you put the interruption monitor in your setUp() function:

override func setUp() {
 addUIInterruptionMonitor(withDescription: "App Would Like to Send You Notifications") { (alert) -> Bool in
     if alert.buttons["Allow"].exists {
         alert.buttons["Allow"].tap()
         return true
     }
     return false
 }
}

Second - if adding a sleep resolves your issue to me this means that this isn't a problem with the iOS version but the behaviour of your application on this iOS version. I've had a similar problem where the dummy tap that should trigger the UIInterruptionMonitor was actually being executed before the prompt has appeared which lead to not handling the prompt. You could create a small expectation that waits for either your app loading(by checking some element is present) or until the prompt has appeared and then perform the dummy tap.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Haroun Hajem
Solution 2 Rimon Koroni
Solution 3 drunkencheetah