确定应用程序是打开还是关闭 (iOS)

Posted

技术标签:

【中文标题】确定应用程序是打开还是关闭 (iOS)【英文标题】:Determining whether an app is open or closed (iOS) 【发布时间】:2018-01-08 16:43:16 【问题描述】:

我正在使用 firebase 进行推送通知,一切都在推送通知端运行。我正在使用通知来推送视图控制器,但是在进行此调用之前,我需要知道应用程序是否已加载。

我已经了解了如何确定应用程序的状态,但这对我没有用处。我需要确定该应用程序之前是否已加载,因为如果它已加载并关闭(并变为非活动状态),我可以毫无问题地推送我的新视图控制器。但是,如果应用程序被终止并加载,我会遇到一些我进行的 API 调用的问题。我想确定应用程序的状态,以便我可以适当地处理对非活动(但已加载)应用程序或死(非活动,未打开)应用程序的通知。

我尝试了两种方法:

UIApplicationState state = [[UIApplication sharedApplication] applicationState];

        if (state == UIApplicationStateBackground) 
            NSLog(@"app is loaded in the background");
            //perform segue immediately to notification screen
        

        if (state == UIApplicationStateInactive) 
            NSLog(@"app is completely inactive")
            //perform segue to loading screen (where it will then segue to notification screen)
        

不幸的是,UIApplicationStateBackground 似乎与后台服务有关,而我的应用程序没有。在我目前的情况下,当我收到 FCM 通知时,总是会调用 UIApplicationStateInactive 的代码。

我尝试的另一种方法是将boolean 添加到我的应用程序的 plist 中,并在应用程序变为非活动状态时将其设置为 false。然后在应用程序收到通知时检查布尔值,然后将其激活。然而,这似乎也永远不会奏效。

是否有我可以访问的属性来确定应用程序是已加载但处于非活动状态,还是完全死机且未加载任何内容?

【问题讨论】:

您是说安装后需要知道这是第一次运行应用程序还是以后运行?或者,如果应用在收到通知时处于“打开”状态,您现在想要这样做吗? @UpholderOfTruth 我想知道应用程序当前是否打开,而不是是否是第一次运行应用程序。想象一下 3 个场景: 1,应用程序打开并收到通知。 2、应用已经打开并且已经加载了一个页面(双击home可以访问)。 3,应用程序已完全关闭,正在重新启动。 2 & 3 影响我如何进入我的应用程序,目前我似乎无法调试它,因为当您关闭应用程序时,您会断开调试器。 所以 1 表示在前台运行,2 表示当前在后台但未终止,3 表示终止不运行? @UpholderOfTruth 是的。我目前通过创建一个应用程序状态枚举来构建一个解决方案,并将其保存到应用程序的 plist 中,然后根据存储的枚举值执行代码。然而,我的解决方案相当复杂,我相信一定有比我正在做的更简单的方法! @UpholderOfTruth 对于 1 和 2,3,firebase 调用了不同的方法,因此当应用程序在前台运行时显示通知我没有任何问题。问题在于区分打开但不活动的应用和关闭的应用。 【参考方案1】:

首先解释一下所面临的情况。因此,当收到通知时,应用可以处于以下三种状态之一:

    在前台运行 在后台暂停 已终止

但是,当收到通知时,只有两种接收方法,一种用于状态 1,另一种用于状态 2 和 3。

所以状态 1 可以处理没有问题,但问题是如何在通知方法中区分状态 2 和 3。

使用状态变量(保存在某处)来表示“inBackground”和“终止”是行不通的,因为一旦您的应用程序进入后台,您可能不会被告知它是否已终止(这就是应用程序的方式生命周期有效)。因此,当应用程序在后台运行时,您将状态更改为“inBackground”,但用户随后将其终止并且应用程序未被通知,因此状态不正确。我的公司应用程序会执行类似的操作来确定启动时的最后状态,但我不负责该开发,所以我不能说出确切的机制。

现在在这种情况下,您可以通过删除仅具有“inBackground”标志来解决此问题,该标志在应用程序后台设置时设置并在应用程序返回前台或启动时重置(在处理任何通知之前)。因此,当收到通知时,您只需检查此“inBackground”标志。

但是,也许更好的解决方案是,当收到通知时,您将应用程序置于已知状态(可能返回到初始视图控制器),然后将应用程序设置为响应通知的状态。您对用户不可见地执行这一切,因此它似乎只是转到了应用程序中的正确位置。这种方法的优点是它应该适用于任何时候收到通知。当然,执行此操作的具体机制取决于您的应用。

这些是我对它的看法,但我需要说我绝不是这方面的专家,因为我没有过多地使用通知。

【讨论】:

以上是关于确定应用程序是打开还是关闭 (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

确定 viewWillAppear 来自打开应用程序,还是取消选择模式

如何确定引导崩溃是打开还是关闭?

警报视图没有确定/关闭按钮?

iOS App名称选择有效性[关闭]

检查系统声音是打开还是关闭

如何确定 iOS 应用程序是使用开发证书还是分发证书签名的?