7

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?

podomunro
  • 495
  • 4
  • 16

3 Answers3

0

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.

Haroun Hajem
  • 5,223
  • 3
  • 26
  • 39
0

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()

  • 1
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Mar 13 '22 at 12:26
0

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.

drunkencheetah
  • 354
  • 1
  • 8