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

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

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

在applicationDidBecomeActive中,我使用了以下代码:
    if (fastAppSwitching == YES) {
        self.fastAppSwitching = NO; //stop, don't go any further
    }
    else {
       ...
    }

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

添加一个名为passedThroughWillEnterForeground的新布尔。

在applicationWillResignActive中:
self.passedThroughWillEnterForeground = NO;

在applicationDidEnterBackground中:
self.passedThroughWillEnterForeground = NO;

在applicationWillEnterForeground中:
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:我认为我们还需要布尔值来告知应用程序是否从终止启动。

最佳答案

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

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

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

问题是,此方法是在applicationWillEnterForeground:之后调用的,因此您无法在该方法中知道您的应用是手动启动还是自动启动。

但是,我怀疑如果需要以特定方法检测到此错误,则可能会遇到设计问题,并且可能应该重新组织代码。

10-07 19:51
查看更多