【问题标题】:How to tell if leaving iOS app entered foreground from fast-app switching or manually?如何判断离开iOS应用程序是从快速应用程序切换还是手动进入前台?
【发布时间】:2012-11-16 23:05:29
【问题描述】:

有没有办法判断 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。

在applicationWillResignActive中:

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

【问题讨论】:

  • “手动”是什么意思?快速应用切换不也是手动完成的吗?
  • 我的术语可能不正确,但我知道 Facebook、Dropbox 和其他第 3 方通常会在应用内实现快速应用切换以进行登录。
  • 哦,我明白了。所以你的意思是你想知道你的应用是由另一个应用还是用户启动的,对吧?
  • 我打算向您指出该方法...好吧,在这种情况下是 IDK。但是为什么你需要 applicationWillEnterForeground; 呢?我在这里闻到了设计问题。
  • 只是对采用此处描述的解决方案的其他人的警告,applicationDidBecomeActive: 在用户例如调用时被调用忽略电话或短信,不像applicationWillEnterForeground

标签: iphone ios facebook background fast-app-switching


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我认为这基本上是一个很好的答案,但事后我学到了更多,正如我在原始问题中的 cmets 中看到的那样。我仍然想找到一种更简单的方法,在应用程序委托中设置 bools 来判断应用程序是否通过快速切换或应用内授权来授权另一个应用程序返回
【解决方案2】:

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

【讨论】:

  • 根据他上面的评论,“是的,完全正确。我知道我可以在 application:openURL:sourceApplication:annotation:(id)annotation 中找到它,但问题是直到 applicationWillEnterForeground 之后才调用该方法,这为时已晚."。所以他正在寻找一个在此之前会被调用的委托方法。
  • 道歉。我错过了关于这个的评论。
  • @MichaelMior 没问题,这就是我最终要去的地方。我让 H2CO3 有机会将他的 cmets 添加为答案,因为他帮助我尽早引导我朝着正确的方向前进。谢谢你的回答。
猜你喜欢
  • 2012-01-07
  • 2016-12-22
  • 1970-01-01
  • 2014-05-25
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多