有没有办法判断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:
之后调用的,因此您无法在该方法中知道您的应用是手动启动还是自动启动。但是,我怀疑如果需要以特定方法检测到此错误,则可能会遇到设计问题,并且可能应该重新组织代码。