检查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许可才能使其工作。