2016-08-24 111 views
0

我們已經添加了今天的擴展到我們的應用程序最近。iOS今日擴展崩潰

它是一個帶有簡單tableView的擴展,用於從我們的服務器加載數據,使用Swift編寫。

但是擴展程序在用戶在線後,我們收到了很多來自Crashlytics的崩潰數據,Apple也報告了相同的崩潰問題。

但是,我們無法重現崩潰,甚至找不到崩潰的原因,因爲系統正在調用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) 

widgetPerformUpdateWithCompletionHandler

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) 
} 

奇怪的代碼是:

  1. ,而我們通常使用我們的今天,擴展大家有沒有遇到崩潰的問題(這如果今天擴展崩潰應該顯示Unable to load

  2. 我們沒有收到用戶報告今天的分機無法使用的任何問題。

  3. 我們在我們的設備上發現了相同的崩潰日誌,但今天的分機正常工作,如1.所述。而且,記錄崩潰日誌的時間,我沒有使用我的手機!

所以我們猜測這是一個「假」碰撞,碰撞記錄了,但擴展沒有真正崩潰。

有沒有人面臨同樣的問題? 謝謝!

+0

你能在我們崩潰的地區顯示你的代碼嗎? – matt

+0

Hi @matt我已經添加了widgetPerformUpdateWithCompletionHandler的代碼,請你看一下嗎? – Johnny

+0

你不應該返回'NoData'嗎?您在返回時還沒有數據,因爲您的數據稍後會在後臺線程中提供。 (或者你或者在主線程中聯網,這是一個總的禁止號碼。) – matt

回答

0

回答我的問題,

@馬特是正確的,現在我打電話的completionHandler只有當數據取任務完成,而不是總叫completionHandler在最後widgetPerformUpdateWithCompletionHandler方法。

我沒有收到崩潰,問題解決了!