我正在尝试检测我的应用是否是从推送启动的,并且有大量的线程和答案。在我的情况下,它们都是错的,并导致我写错了行为。他们都告诉大致写下这个:
-(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;
}
...
}
当我尝试这个时,我的应用程序认为它是从通知开始的,当我打电话时,应用程序在后台,几乎总是在应用程序运行但不直接激活时。当我的用户返回应用程序时,应用程序就像他们点击了通知并打开它一样,而用户根本没有与它进行交互。我不知道为什么人们在许多问题中接受这个作为正确的答案。
我如何才能简单地检查我的应用是否是从通知启动的,无论应用的先前状态如何(在后台运行还是刚刚启动)?
答案 0 :(得分:1)
没有一种简单的方法可以告诉你,只有当应用程序处于活动状态或后台时,它才会从pushNotificaiton打开。你必须做一些工作,
UIApplicationStateInactive应用程序在前台运行但是 没有收到活动。这可能是由于中断造成的 或者因为应用程序正在转换为背景或来自背景
这是电话中断的最佳人选,
您还可以添加一些其他工作来检查应用程序是否曾在后台输入,如果是,则在此之后,如果didReceiveRemoteNotification
方法被调用,则表示它来自推送通知。
答案 1 :(得分:1)
检查store
绝对是错误的。如果您的推送通知标有UIApplicationStateBackground
,那么您的应用将在该状态下被调用,以便您可以执行内容下载。这将在没有任何用户交互的情况下发生。
我所知道的最好的方法是单独使用content-available: 1
检查(即您的第一个代码示例)。
正如您所说,如果在您的应用被电话中断时收到通知,则此功能无效。这是一个有趣的问题。您可以使用UIApplicationStateInactive
跟踪通话状态,但我没有这样做,我也不知道您是否需要VOIP权限才能使其正常工作。