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

时间:2018-01-08 16:43:16

标签: ios objective-c iphone push-notification

我正在使用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的代码。

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

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

1 个答案:

答案 0 :(得分:0)

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

  1. 在前台跑步
  2. 暂停在后台
  3. 终止
  4. 然而,当收到通知时,只有两种接收方法,一种用于状态1,一种用于状态2和3。

    因此状态1可以处理没有问题,但问题是如何区分状态2& 3通知方法。

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

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

    然而,或许更好的解决方案是,当收到通知时,您将应用程序置于已知状态(可能返回到初始视图控制器),然后将应用程序设置为响应通知的状态。你无形中对用户这样做,所以它似乎只是去了应用程序中的正确位置。这种方法的优点是它可以在收到通知的任何时候工作。当然,这样做的确切机制取决于您的应用程序。

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