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

时间:2015-08-14 21:41:23

标签: ios ios8 push-notification

我正在尝试检测我的应用是否是从推送启动的,并且有大量的线程和答案。在我的情况下,它们都是错的,并导致我写错了行为。他们都告诉大致写下这个:

-(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;
    }
    ...
}

当我尝试这个时,我的应用程序认为它是从通知开始的,当我打电话时,应用程序在后台,几乎总是在应用程序运行但不直接激活时。当我的用户返回应用程序时,应用程序就像他们点击了通知并打开它一样,而用户根本没有与它进行交互。我不知道为什么人们在许多问题中接受这个作为正确的答案。

我如何才能简单地检查我的应用是否是从通知启动的,无论应用的先前状态如何(在后台运行还是刚刚启动)?

2 个答案:

答案 0 :(得分:1)

没有一种简单的方法可以告诉你,只有当应用程序处于活动状态或后台时,它才会从pushNotificaiton打开。你必须做一些工作,

  

UIApplicationStateInactive应用程序在前台运行但是   没有收到活动。这可能是由于中断造成的   或者因为应用程序正在转换为背景或来自背景

这是电话中断的最佳人选, 您还可以添加一些其他工作来检查应用程序是否曾在后台输入,如果是,则在此之后,如果didReceiveRemoteNotification方法被调用,则表示它来自推送通知。

答案 1 :(得分:1)

检查store绝对是错误的。如果您的推送通知标有UIApplicationStateBackground,那么您的应用将在该状态下被调用,以便您可以执行内容下载。这将在没有任何用户交互的情况下发生。

我所知道的最好的方法是单独使用content-available: 1检查(即您的第一个代码示例)。

正如您所说,如果在您的应用被电话中断时收到通知,则此功能无效。这是一个有趣的问题。您可以使用UIApplicationStateInactive跟踪通话状态,但我没有这样做,我也不知道您是否需要VOIP权限才能使其正常工作。