检查iOS应用程序是否正确从推送启动

检查iOS应用程序是否正确从推送启动,ios,ios8,push-notification,Ios,Ios8,Push Notification,我正在尝试检测我的应用程序是否是从push启动的,并且有大量的线程和答案。他们在我的情况下都是错误的,并导致我写不正确的行为。他们都告诉我们大致写下: -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ BOOL wasLaunchedFromPush = NO; if (application.applicationState

我正在尝试检测我的应用程序是否是从push启动的,并且有大量的线程和答案。他们在我的情况下都是错误的,并导致我写不正确的行为。他们都告诉我们大致写下:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    BOOL wasLaunchedFromPush = NO;
    if (application.applicationState == UIApplicationStateInactive) {
        wasLaunchedFromPush = YES;
    }
    ...
}
或者这个:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    BOOL wasLaunchedFromPush = NO;
    if (application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground) {
        wasLaunchedFromPush = YES;
    }
    ...
}
当我尝试这一点时,我的应用程序认为它是从我打电话时的通知启动的,应用程序在后台,几乎总是在应用程序运行但不直接激活时启动。当我的用户返回应用程序时,应用程序的行为就像他们点击了通知并打开了它,而用户根本没有与它进行交互。我不知道为什么人们在很多问题上都认为这是一个正确的答案


我怎么能简单地检查我的应用程序是否是通过通知启动的,也不管应用程序以前的状态(在后台运行或刚刚启动)?

没有简单的方法可以告诉您,当应用程序处于活动状态或后台时,它是通过PushNotification打开的。你得做些变通

UIApplicationStateInactive应用程序正在前台运行,但处于非活动状态 不接收事件。这可能是中断的结果 或者因为应用程序正在转换到后台或从后台转换

这是电话中断的最佳候选者,
您还可以添加一些其他工作来检查应用程序是否曾在后台输入,如果是,则在这之后if
didReceiveMemotentification
method get called-its表示来自推送通知

如果您只想知道您的应用程序是何时通过远程通知启动的,您应该在
-应用程序:didFinishLaunchingWithOptions:
-应用程序:willFinishLaunchingWithOptions:
中进行检查。您可以检查
launchOptions
字典中是否存在
uiapplicationaunchoptions远程通知键


didReceiveRemoteNotification
是在应用程序运行并收到远程通知时调用的。无论任何用户交互,都会调用它,这是因为如果应用程序正在运行,将不会有通知(弹出窗口)供用户交互。

对照
UIApplicationStateBackground
检查肯定是错误的。如果推送通知标记为
可用内容:1
,则将在该状态下调用您的应用程序,以便您可以执行内容下载。这将在没有任何用户交互的情况下发生

我所知道的最好的方法是单独使用检查
UIApplicationStateInactive
(即您的第一个代码示例)

正如您所说,如果通知在您的应用程序被电话中断时到达,则此功能不起作用。这是一个有趣的问题。您可以使用
CTCallCenter
跟踪呼叫状态,但我还没有这样做,我不知道您是否需要VOIP许可才能正常工作