Programmatically sending an app to background
Asked Answered
B

4

16

Is there a way to send the application to background? Similarly to how you can call XCUIApplication.terminate(), I have some UI Elements to test on applicationDidBecomeActive(_:). Does anyone know if this is at all possible?

Bunde answered 11/11, 2015 at 14:44 Comment(0)
E
10

I would recommend checking out XCUIDevice. Here is how you might press the home button and then relaunch the application

func testExample() {

    // Has a nav bar.
    XCTAssert(XCUIApplication().navigationBars.element.exists)

    XCUIDevice().press(XCUIDeviceButton.home)
    // Before Swift 3: XCUIDevice().pressButton(XCUIDeviceButton.Home)
    XCUIApplication().launch()

    // Navigationbar still there on second launch.
    XCTAssert(XCUIApplication().navigationBars.element.exists)
}
Elmaelmajian answered 15/11, 2015 at 2:11 Comment(2)
Works well with iOS Simulator (9.3) and Xcode 7.3. Thanks!Naturalist
According to the API documentation of XCUIApplication.launch() (Xcode 7.3.1), it TERMINATE the application if it is already running. I think it is not suitable for this case - send the application to background and then bring it up again.Peraea
A
7

In my case I wanted to background the app and open it where I previously left it. To background the app:

XCUIDevice.shared.press(.home)

To re-open the app where I left it:

XCUIApplication().activate()

Re-launching the app using XCUIApplication().launch() would launch the app from new.

I am using Swift 4.2

Audryaudrye answered 24/4, 2019 at 10:57 Comment(0)
D
6

I just tried UIApplication.sharedApplication().performSelector("suspend") successfully.

dispatch_after(2, dispatch_get_main_queue(), {       
    // suspend the app after two seconds
    UIApplication.sharedApplication().performSelector("suspend")
})

// Swift 4 version
UIApplication.shared.perform(Selector("suspend"))
Dogcart answered 11/11, 2015 at 15:0 Comment(3)
I am trying to get this to work for XCode Automated UI Tests, should this work? Or is this answer appropriate for another type of testing?Bunde
@Dogcart It doesn't work for me (Xcode 7.3.1). dispatch_after(2, dispatch_get_main_queue(), { // suspend the app after two seconds UIApplication.sharedApplication().performSelector(#selector(NSURLSessionTask.suspend)) }) Does it simply put the app into suspend state, instead of background state?Peraea
@Bunde Have you found the way to do this in UITest? I still finding on this, but no clue :(Sot
O
5

In Xcode 9.0, Apple introduced XCUIApplication.activate(). activate() will launch the application if necessary, but will not terminate it if it is already running. Thus:

func testExample() {
    // Background the app
    XCUIDevice().press(.home)
    // Reactivate the app
    XCUIApplication().activate()
}
Oneiromancy answered 7/12, 2017 at 6:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.