检查iOS应用程序是否正常启动
我试图检测我的应用程序是否从推送启动,并且有大量的线程和答案。他们在我的情况都是错误的,并导致我写错误的行为。他们都告诉写大致是这样的:检查iOS应用程序是否正常启动
-(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;
}
...
}
当我尝试这一点,我的应用程序认为它是从通知开始,当我在一个电话,应用程序在后台,几乎总是在应用程序正在运行但不直接活动时。当我的用户返回到应用程序时,应用程序的行为就像他们挖掘了通知并打开了它,而用户根本没有与之通信。我不知道为什么人们在很多问题上接受这个答案是正确的。
我该如何简单地检查我的应用程序是否从通知启动,也不管应用程序以前的状态(在后台运行还是刚刚启动)?
有没有简单的方法告诉你,它从pushNotificaiton打开,特别是当应用程序处于活动或背景。你必须做一些变通,
UIApplicationStateInactive应用程序在前台运行,但是 没有接收事件。因为应用正在向或从背景
这这可能发生,因为中断 的结果,或者是电话呼叫中断最佳人选, 您还可以添加周围的一些其他工作,以检查是否应用曾经进入后台或没有,如果是的话,那么如果didReceiveRemoteNotification
方法调用它的意思是它的推送通知。
如果你只是想知道,当你的应用程序是从远程通知启动,你应该在- application:didFinishLaunchingWithOptions:
或- application:willFinishLaunchingWithOptions:
检查这个。您可以检查launchOptions
字典中是否存在UIApplicationLaunchOptionsRemoteNotificationKey
。
didReceiveRemoteNotification
在您的应用程序运行并收到远程通知时会调用。无论是否有任何用户交互,都会调用它,因为如果应用程序正在运行,则不会有用户与其进行交互的通知(弹出)。
检查UIApplicationStateBackground
是绝对错误的。如果您的推送通知被标记为content-available: 1
,那么您的应用将在该状态下被调用,以便您可以执行内容下载。这将发生在没有任何用户交互
我所知道的最好的办法是单独使用针对UIApplicationStateInactive
的检查(即您的第一个代码示例)。
正如您所说,如果通知在您的应用程序被电话打断时到达,则此功能无效。这是一个有趣的问题。您可以使用CTCallCenter
跟踪呼叫状态,但我没有这样做,我不知道您是否需要VOIP许可才能使其工作。