iOS今日扩展崩溃

iOS今日扩展崩溃,ios,swift,crash,today-extension,Ios,Swift,Crash,Today Extension,我们最近在应用程序中添加了“今日”扩展 它是一个带有简单tableView的扩展,用于从我们的服务器加载数据,用Swift编写 但是,在我们的用户在线使用扩展后,我们收到了来自Crashlytics的大量崩溃数据,而且苹果也报告了相同的崩溃问题 但是,我们无法再现崩溃,甚至无法找到崩溃的原因,因为系统调用的widgetPerformUpdateWithCompletionHandler方法正在崩溃 下面是崩溃日志的详细信息,部分信息已被替换 Crashed: com.apple.main-thr

我们最近在应用程序中添加了“今日”扩展

它是一个带有简单tableView的扩展,用于从我们的服务器加载数据,用Swift编写

但是,在我们的用户在线使用扩展后,我们收到了来自
Crashlytics
的大量崩溃数据,而且苹果也报告了相同的崩溃问题

但是,我们无法再现崩溃,甚至无法找到崩溃的原因,因为系统调用的
widgetPerformUpdateWithCompletionHandler
方法正在崩溃

下面是崩溃日志的详细信息,部分信息已被替换

Crashed: com.apple.main-thread
0  MyAppWidget                    0x100091d8c MyAppWidgetViewController.(widgetPerformUpdateWithCompletionHandler((NCUpdateResult) -> ()) -> ()).(closure #1) (MyAppWidgetViewController.swift)
1  MyAppKit                       0x100603ab4 partial apply for thunk (PostService.swift)
2  MyAppKit                       0x100626080 ServiceRequestPerfomer.(performRequest(A, complete : ([B]?, NSError?) -> ()?) -> ()).(closure #1) (ServiceRequestPerformer.swift:35)
3  MyAppKit                       0x1006258d4 partial apply for ServiceRequestPerfomer.(performRequest(A, complete : ([B]?, NSError?) -> ()?) -> ()).(closure #1) (ServiceRequestPerformer.swift)
4  MyAppKit                       0x100626b34 ServiceRequestPerfomer.((request in _3C50B415180DDC893FFCB75CD7EE7019)(A, complete : (response : Response?, error : NSError?) -> ()?) -> ()).(closure #1) (ServiceRequestPerformer.swift:144)
5  Moya                           0x1004b7468 MoyaProvider.(requestNormal(A, queue : OS_dispatch_queue?, progress : (progress : ProgressResponse) -> ()?, completion : (result : Result<Response, Error>) -> ()) -> Cancellable).(closure #1).(closure #1) (Moya.swift:229)
6  Moya                           0x1004b8968 MoyaProvider.((sendAlamofireRequest in _1A5616FEE5C423A992964CB19AABD52B)(Request, target : A, queue : OS_dispatch_queue?, progress : (progress : ProgressResponse) -> ()?, completion : (result : Result<Response, Error>) -> ()) -> CancellableToken).(closure #3) (Moya.swift)
7  Moya                           0x1004b57b8 partial apply for MoyaProvider.((sendAlamofireRequest in _1A5616FEE5C423A992964CB19AABD52B)(Request, target : A, queue : OS_dispatch_queue?, progress : (progress : ProgressResponse) -> ()?, completion : (result : Result<Response, Error>) -> ()) -> CancellableToken).(closure #3) (Moya.swift)
8  Alamofire                      0x1002cff64 Request.(response(queue : OS_dispatch_queue?, completionHandler : (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> ()) -> Self).(closure #1).(closure #1) (ResponseSerialization.swift)
9  libdispatch.dylib              0x1819e14bc _dispatch_call_block_and_release + 24
10 libdispatch.dylib              0x1819e147c _dispatch_client_callout + 16
11 libdispatch.dylib              0x1819e6b84 _dispatch_main_queue_callback_4CF + 1844
12 CoreFoundation                 0x181f4cd50 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
13 CoreFoundation                 0x181f4abb8 __CFRunLoopRun + 1628
14 CoreFoundation                 0x181e74c50 CFRunLoopRunSpecific + 384
15 GraphicsServices               0x18375c088 GSEventRunModal + 180
16 UIKit                          0x18715e088 UIApplicationMain + 204
17 libxpc.dylib                   0x181c38ce0 _xpc_objc_main + 784
18 libxpc.dylib                   0x181c3a9dc xpc_main + 200
19 Foundation                     0x182a57d60 service_connection_handler + 170
20 PlugInKit                      0x18929ac48 -[PKService run] + 544
21 PlugInKit                      0x18929a8dc +[PKService main] + 56
22 PlugInKit                      0x18929ac6c +[PKService _defaultRun:arguments:] + 20
23 libextension.dylib             0x18286a058 NSExtensionMain + 64
24 libdispatch.dylib              0x181a128b8 (Missing)
奇怪的是:

  • 在正常使用Today扩展时,我们没有遇到崩溃问题(如果Today扩展崩溃,它应该显示
    无法加载

  • 我们没有收到任何来自用户的问题,报告今天的扩展无法工作

  • 我们在设备上发现了相同的崩溃日志,但today扩展正常工作,如所述。还有,撞车日志记录的时间,我没有用我的手机

  • 所以我们猜测这是一个“假”崩溃,崩溃被记录下来了,但是扩展没有真正崩溃

    有人面临同样的问题吗?
    谢谢大家!

    回答我自己的问题

    @matt是对的,现在我只在数据获取任务完成时调用
    completionHandler
    ,而不是总是在
    WidgetPerformUpdate WithCompletionHandler
    方法的最后一个调用
    completionHandler


    我再也没有遇到车祸了,问题解决了

    你能在我们要崩溃的区域显示你的代码吗?嗨@matt我已经添加了widgetPerformUpdateWithCompletionHandler的代码,你能看一下吗?你不应该返回
    NoData
    ?返回时您还没有数据,因为您的数据稍后会在后台线程中提供。(要么是这样,要么就是你在主线程上建立网络,这完全是不可能的。)@matt谢谢,我来试试。现在,仅当任务完成时才调用completionBlock。
    func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) {
        // Perform any setup necessary in order to update the view.
        // If an error is encountered, use NCUpdateResult.Failed
        // If there's no update required, use NCUpdateResult.NoData
        // If there's an update, use NCUpdateResult.NewData
    
        let options: [String: AnyObject] = [DCKPostPopularAttributeName : true.stringValue,
                                            DCKPaginationLimitAttributeName : 5]
        postService.posts(options: options) { (posts, error) in
            let historyPosts = self.userDefaults.arrayForKey(MyAppWidgetViewController.WidgetPostReadIdentifier) as? [UInt]
            if let historyPosts = historyPosts {
                self.posts = posts!.filter({ (Post) -> Bool in
                    return !historyPosts.contains(Post.id)
                })
            } else {
                self.posts = posts!
            }
    
            self.tableView.reloadData()
            self.tableView.hidden = false;
            self.loadingLabel?.hidden = true
            self.activityIndicator?.stopAnimating()
    
            let contentSize = self.tableView.contentSize
            self.preferredContentSize = CGSizeMake(CGRectGetWidth(self.view.frame), contentSize.height);
    
            self.loadMorePostsIfNeeded()
        }
        completionHandler(NCUpdateResult.NewData)
    }