How to tell if leaving iOS app entered foreground from fast-app switching or manually?

Posted by JPK on Stack Overflow See other posts from Stack Overflow or by JPK
Published on 2012-11-16T23:05:29Z Indexed on 2012/11/17 5:00 UTC
Read the original article Hit count: 161

Is there a way to tell if an iOS app enters the foreground from fast-app switching or manually? I need to know by the time applicationWillEnterForeground is called, so some specific code can be executed (or not executed) depending on the condition in which the app entered the foreground.

EDIT: It turned out that this was more of a design issue for me. I moved my code to applicationDidBecomeActive. I also added a BOOL property to the appDelegate called fastAppSwitching (probably the wrong name for it). I set this to YES in application:handleOpenURL and application:openURL:sourceApplication:annotation. Then I added the following code to application:didFinishLaunchingWithOptions:

        if (launchOptions) {
            self.fastAppSwitching = YES;
        }
        else {
            self.fastAppSwitching = NO;
        }

In applicationDidBecomeActive, I used the following code:

    if (fastAppSwitching == YES) {
        self.fastAppSwitching = NO; //stop, don't go any further
    }
    else {
       ...
    }

EDIT2: MaxGabriel makes a good point below: "Just a warning to others taking the solution described here, applicationDidBecomeActive: is called when the user e.g. ignores a phone call or text message, unlike applicationWillEnterForeground". This is actually also true for in-app purchases and Facebook in-app authorization (new in iOS 6). So, with some further testing, this is the current solution:

Add a new Bool called passedThroughWillEnterForeground.

In applicationWillResignActive:

self.passedThroughWillEnterForeground = NO;

In applicationDidEnterBackground:

self.passedThroughWillEnterForeground = NO;

In applicationWillEnterForeground:

self.passedThroughWillEnterForeground = YES;

In applicationDidBecomeActive:

    if (passedThroughWillEnterForeground) {
        //we are NOT returning from 6.0 (in-app) authorization dialog or in-app purchase dialog, etc
        //do nothing with this BOOL - just reset it
        self.passedThroughWillEnterForeground = NO;
    }
    else {
        //we ARE returning from 6.0 (in-app) authorization dialog or in-app purchase dialog - IE
        //This is the same as fast-app switching in our book, so let's keep it simple and use this to set that
        self.fastAppSwitching = YES;
    }

    if (fastAppSwitching == YES) {

        self.fastAppSwitching = NO;
    }
    else {
        ...
    }

EDIT3: I think we also need a bool to tell if app was launched from terminated.

© Stack Overflow or respective owner

Related posts about iphone

Related posts about ios