为什么 iOS 静默推送触发器 application:didFinishLaunchingWithOptions:当应用程序处于后台时

Why iOS silent push triggers application:didFinishLaunchingWithOptions: when app is in background

我在 application:didFinishLaunchingWithOptions: 方法中有一些超时为 15 秒的网络请求。我发现了以下奇怪的情况。

T1:应用程序通过按主页按钮进入后台
T2:应用收到静默推送并执行didFinishLaunchingWithOptions:方法,然后发送请求
T3(> T2 + 15s):用户点击应用程序图标。 T2 中的所有请求立即超时。

我的问题是为什么在那种情况下会触发didFinishLaunchingWithOptions以及如何调试(重现这种情况,因为以上都在日志中)。

您可以检查应用状态以确定应用在收到通知时是否从后台启动:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground ) { 
        //opened from a push notification when the app was on background
     } 
}

编辑::

这里没有什么可调试的,这是预期的功能。

如果想做不同的处理,可以找

UIApplicationLaunchOptionsLocalNotificationKey

在启动选项内部,并在应用程序从通知启动时执行您需要的任何操作。

didFinishLaunchingWithOptions 如果您的应用程序被挂起或终止并且您收到通知,则会调用。您的应用程序可能已在后台崩溃,这就是调用 didFinishLaunchingWithOptions 的方式。

要调试该场景,请执行以下操作。

  1. 点击目标然后selectEdit Scheme

  2. Select 发射到 Wait for executable to be launched

  3. 运行 应用程序。

现在您可以在 didFinishLaunchingWithOptions 中添加断点并向您的设备发送通知。一旦设备收到通知,您就可以进行调试。

静默推送可以将暂停的应用程序(由于内存紧张已被 iOS 系统正确终止,而不是用户手动终止)启动到后台。在这种情况下,应用程序的生命周期变为:

  1. application:willFinishLaunchingWithOptions:
  2. application:didFinishLaunchingWithOptions:
  3. applicationDidEnterBackground:

苹果文档:About the Background Execution Sequence