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帖子,这个问题已经解决了.
iOS 8 NSInternalInconsistencyException
基本上,当您调用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中实现这两种方法而不会出现上面提到的错误.或者这两种方法并行实现performFetchWitchCompletionHandler并didReceiveRemoteNotification相互干扰?
我不知道如何解释它,但这听起来像是“竞争条件”,这些方法被“紧密地一起”调用。我会尝试将完成包装在
DispatchQueue.main.asyncAfter with interval of .now()
Run Code Online (Sandbox Code Playgroud)
除非您想模拟并尝试手动调用该方法两次。
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |