两个方法的completionHandler performFetchWitchCompletionHandler和didReceiveRemoteNotification相互干扰?

Ale*_*e89 13 ios completionhandler swift background-fetch

自2017年11月起,我有一个iOS(swift)应用程序可用AppStore.我添加了Firebase Analytics和Crashlytics,以主动查看在开发和测试期间未发生的问题.

我目前正在努力使用以下Stacktrace,我在Firebase Crashlytics Dashboard中多次使用:

来自Firebase的Stacktrace

致命异常:NSInternalInconsistencyException此请求已被绝育 - 您不能调用-sendResponse:两次,也不能在编码后

Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x1ac20bef8 __exceptionPreprocess
1  libobjc.A.dylib                0x1ab3d9a40 objc_exception_throw
2  CoreFoundation                 0x1ac12006c +[_CFXNotificationTokenRegistration keyCallbacks]
3  Foundation                     0x1acc0c3e0 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  BaseBoard                      0x1aea6cd68 __40-[BSAction sendResponse:withCompletion:]_block_invoke
5  libdispatch.dylib              0x1abc44484 _dispatch_client_callout
6  libdispatch.dylib              0x1abc24754 _dispatch_lane_barrier_sync_invoke_and_complete
7  BaseBoard                      0x1aea20c60 -[BSAction sendResponse:withCompletion:]
8  UIKitCore                      0x1d8c20698 -[UIHandleRemoteNotificationAction sendResponse:]
9  UIKitCore                      0x1d9054d3c __91-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:]_block_invoke_3.2891
10 libdispatch.dylib              0x1abc436c8 _dispatch_call_block_and_release
11 libdispatch.dylib              0x1abc44484 _dispatch_client_callout
12 libdispatch.dylib              0x1abc23b44 _dispatch_main_queue_callback_4CF$VARIANT$armv81
13 CoreFoundation                 0x1ac19a1bc __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
14 CoreFoundation                 0x1ac195084 __CFRunLoopRun
15 CoreFoundation                 0x1ac1945b8 CFRunLoopRunSpecific
16 GraphicsServices               0x1ae408584 GSEventRunModal
17 UIKitCore                      0x1d903cbc8 UIApplicationMain
18 <APP-NAME>                     0x10251bc84 main (AppDelegate.swift:18)
19 libdyld.dylib                  0x1abc54b94 start
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在开发和测试期间,根本不会发生这种特定错误.

关于这个话题我最后几天做了很多研究.我找到了几个SO帖子,这个问题已经解决了.

iOS8后台获取问题

iOS 8 NSInternalInconsistencyException

无法理解MyApp崩溃的位置

基本上,当您调用completionHandler两次时会发生崩溃.但在不同的帖子中,他们指的是两种不同的方法,但两者都有相同的方法completionHandler:

performFetchWitchCompletionHandler

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // code here
  completionHandler(.newData)
}
Run Code Online (Sandbox Code Playgroud)

didReceiveRemoteNotification

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // code here
  completionHandler(.newData)
}
Run Code Online (Sandbox Code Playgroud)

我找不到一个位置,我将这两种方法的completionHandler调用两次.我的问题是,如果可以在AppDelegate中实现这两种方法而不会出现上面提到的错误.或者这两种方法并行实现performFetchWitchCompletionHandlerdidReceiveRemoteNotification相互干扰?

Ale*_*der 1

我不知道如何解释它,但这听起来像是“竞争条件”,这些方法被“紧密地一起”调用。我会尝试将完成包装在

DispatchQueue.main.asyncAfter with interval of .now()
Run Code Online (Sandbox Code Playgroud)

除非您想模拟并尝试手动调用该方法两次。