1

有没有办法判断 iOS 应用是从快速应用切换还是手动进入前台?我需要知道调用 applicationWillEnterForeground 的时间,因此可以根据应用程序进入前台的条件执行(或不执行)某些特定代码。

编辑:事实证明,这对我来说更像是一个设计问题。我将代码移至 applicationDidBecomeActive。我还向名为 fastAppSwitching 的 appDelegate 添加了一个 BOOL 属性(可能是错误的名称)。我在 application:handleOpenURL 和 application:openURL:sourceApplication:annotation 中将此设置为 YES。然后我将以下代码添加到应用程序:didFinishLaunchingWithOptions:

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

在 applicationDidBecomeActive 中,我使用了以下代码:

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

EDIT2:MaxGabriel 在下面提出了一个很好的观点:“只是对采用此处描述的解决方案的其他人的警告,applicationDidBecomeActive:当用户例如忽略电话或短信时调用,这与 applicationWillEnterForeground 不同”。这实际上也适用于应用内购买和 Facebook 应用内授权(iOS 6 中的新功能)。因此,通过一些进一步的测试,这是当前的解决方案:

添加一个名为passedThroughWillEnterForeground 的新Bool。

在应用程序WillResignActive 中:

self.passedThroughWillEnterForeground = NO;

在 applicationDidEnterBackground 中:

self.passedThroughWillEnterForeground = NO;

在应用程序WillEnterForeground:

self.passedThroughWillEnterForeground = YES;

在 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:我认为我们还需要一个布尔值来判断应用程序是否是从终止状态启动的。

4

2 回答 2

3

如果您的应用程序由另一个应用程序启动,则

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
  sourceApplicarion:(NSString *)bundleID
         annotation:(id)info;

在您的应用程序委托上调用方法。例如,您可以使用此方法将布尔开关设置为 true,以指示应用程序是否由另一个程序启动。

问题是这个方法是在之后 applicationWillEnterForeground:调用的,所以你无法在那个方法中判断你的应用程序是手动启动的还是自动启动的。

但是,我怀疑如果您需要在特定方法中检测到这一点,您可能会遇到设计问题,您可能应该重新组织您的代码。

于 2012-11-17T07:02:53.157 回答
1

如果您的应用是从另一个应用打开的,application:openURL:sourceApplication:annotation则会在您的应用委托上调用。

于 2012-11-17T00:02:31.633 回答