【问题标题】:Why iOS silent push triggers application:didFinishLaunchingWithOptions: when app is in background为什么iOS静默推送触发应用程序:didFinishLaunchingWithOptions:当应用程序在后台时
【发布时间】:2017-08-21 04:14:39
【问题描述】:
我在application:didFinishLaunchingWithOptions: 方法中有一些超时时间为 15 秒的网络请求。我发现了以下奇怪的情况。
T1:应用程序通过按主页按钮进入后台
T2:应用收到静默推送并执行didFinishLaunchingWithOptions:方法,然后发送请求
T3(> T2 + 15s):用户点击应用图标。 T2 中的所有请求都会立即超时。
我的问题是为什么didFinishLaunchingWithOptions在那种情况下被触发以及如何调试(重现这种情况,因为以上都在日志中)。
【问题讨论】:
标签:
ios
background
timeout
launch
silentpush
【解决方案1】:
didFinishLaunchingWithOptions 如果您的应用程序被挂起或终止并且您收到通知,则会调用。您的应用程序可能在后台崩溃,这就是调用 didFinishLaunchingWithOptions 的方式。
要调试该场景,请执行以下操作。
点击目标并选择Edit Scheme
选择启动到Wait for executable to be launched
-
运行应用程序。
现在您可以在didFinishLaunchingWithOptions 中添加断点并向您的设备发送通知。一旦设备收到通知,您就可以进行调试。
【解决方案2】:
您可以检查应用状态以确定应用在收到通知时是否从后台启动:
- (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
在启动选项中,并在应用从通知启动时执行您需要的任何工作。
【解决方案3】:
静推可以将暂停的应用程序(由于内存紧张已被iOS系统正确杀死,而不是用户手动杀死)启动到后台。在这种情况下,应用的生命周期变为:
application:willFinishLaunchingWithOptions:
application:didFinishLaunchingWithOptions:
applicationDidEnterBackground:
苹果文档:About the Background Execution Sequence