Iphone 如何判断离开iOS应用程序是通过快速应用程序切换还是手动进入前台?

Iphone 如何判断离开iOS应用程序是通过快速应用程序切换还是手动进入前台?,iphone,ios,facebook,background,fast-app-switching,Iphone,Ios,Facebook,Background,Fast App Switching,有没有办法判断iOS应用程序是通过快速应用程序切换还是手动进入前台?我需要在调用applicationWillEnterForeground时知道,因此根据应用程序进入前台的条件,可以执行(或不执行)某些特定代码 编辑: 事实证明,这对我来说更像是一个设计问题。我将代码移动到ApplicationIDBecomeActive。我还向appDelegate添加了一个名为fastAppSwitching的BOOL属性(可能名称不对)。我在application:handleOpenURL和appli

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

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

        if (launchOptions) {
            self.fastAppSwitching = YES;
        }
        else {
            self.fastAppSwitching = NO;
        }
在ApplicationIDBecomeActive中,我使用了以下代码:

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

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

添加一个名为passedThroughWillEnterForeground的新Bool

在applicationWillResignActive中:

self.passedThroughWillEnterForeground = NO;
在ApplicationIdentinterBackground中:

self.passedThroughWillEnterForeground = NO;
在applicationWillEnterForeground中:

self.passedThroughWillEnterForeground = YES;
在ApplicationIDBecomeActive中:

    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来判断应用程序是否从已终止的应用程序启动。

如果您的应用程序是从另一个应用程序打开的,则会对您的应用程序代理调用应用程序:openURL:sourceApplication:annotation。

如果您的应用程序是从另一个应用程序打开的,
application:openURL:sourceApplication:annotation将在您的应用程序代理上调用。

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

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
  sourceApplicarion:(NSString *)bundleID
         annotation:(id)info;
方法在您的应用程序委托上调用。您可以使用此方法来创建e。G将布尔值开关设置为true,以指示应用程序是否由其他程序启动

问题是此方法是在
应用程序将进入前台:
之后调用的,因此您无法在该方法中判断您的应用程序是手动还是自动启动的


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

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

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
  sourceApplicarion:(NSString *)bundleID
         annotation:(id)info;
方法在您的应用程序委托上调用。您可以使用此方法来创建e。G将布尔值开关设置为true,以指示应用程序是否由其他程序启动

问题是此方法是在
应用程序将进入前台:
之后调用的,因此您无法在该方法中判断您的应用程序是手动还是自动启动的


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

您所说的“手动”是什么意思?快速应用切换不也是手动完成的吗?我可能没有正确的术语,但我知道Facebook、Dropbox和其他第三方通常会在应用内实现快速应用切换以进行登录。哦,我明白了。所以你的意思是你想知道你的应用是由另一个应用还是用户启动的,对吗?我想给你指的是那个方法。。。在这种情况下,IDK。但是为什么在
应用程序中需要它呢?我在这里发现了一个设计问题。这只是对采用此处所述解决方案的其他人的一个警告,
applicationdidebomeactive:
在用户忽略电话或短信时被调用,而不像
applicationWillEnterForeground
你所说的“手动”是什么意思?快速应用切换不也是手动完成的吗?我可能没有正确的术语,但我知道Facebook、Dropbox和其他第三方通常会在应用内实现快速应用切换以进行登录。哦,我明白了。所以你的意思是你想知道你的应用是由另一个应用还是用户启动的,对吗?我想给你指的是那个方法。。。在这种情况下,IDK。但是为什么在
应用程序中需要它呢?我在这里发现了一个设计问题。这只是对采取此处所述解决方案的其他人的一个警告,
applicationdidebomeactive:
在用户忽略电话或短信时被调用,而不像上面所述的
application将进入前台
,“是的,没错。我知道我可以在
application:openURL:sourceApplication:annotation:(id)annotation
中找到这一点,但问题是直到applicationWillEnterForeground之后才调用该方法,这太晚了。“。因此,他正在寻找一个委托方法,该方法将在此之前调用。抱歉。我错过了关于这件事的评论。@MichaelMior没问题,不管怎样,这就是我最终要去的地方。我给H2CO3机会添加他的评论作为回答,因为他帮助我尽早朝着正确的方向前进。谢谢你的回答。根据他在上面的评论,“是的,没错。我知道我可以在
应用程序:openURL:sourceApplication:annotation:(id)annotation
中找到它,但问题是该方法在applicationWillEnterForeground之后才调用,这太晚了。”。因此,他正在寻找一个委托方法,该方法甚至在此之前就被调用。抱歉。我错过了关于这件事的评论。@MichaelMior没问题,不管怎样,这就是我最终要去的地方。我给H2CO3机会添加他的评论作为回答,因为他帮助我尽早朝着正确的方向前进。谢谢你的回答。我认为这基本上是一个很好的答案,但事实发生后我学到了更多,正如我在原始问题中的评论所示。我仍然想找到一种更简单的方法,让bools在app委托中设置,来判断一个app是否从授权另一个app回来,ei