swift - iOS Today Extension Crashing -


we've added today extension our app recently.

its extension simple tableview load data our server, written in swift.

but after extension online our users, we've received lots of crash data crashlytics , apple reporting same crash issue either.

however, can't reproduce crash, or find reason of crash, because crashing on widgetperformupdatewithcompletionhandler method called system.

below detail of crash log, information replaced.

crashed: com.apple.main-thread 0  myappwidget                    0x100091d8c myappwidgetviewcontroller.(widgetperformupdatewithcompletionhandler((ncupdateresult) -> ()) -> ()).(closure #1) (myappwidgetviewcontroller.swift) 1  myappkit                       0x100603ab4 partial apply thunk (postservice.swift) 2  myappkit                       0x100626080 servicerequestperfomer.(performrequest(a, complete : ([b]?, nserror?) -> ()?) -> ()).(closure #1) (servicerequestperformer.swift:35) 3  myappkit                       0x1006258d4 partial apply 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 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) 

and code of widgetperformupdatewithcompletionhandler

func widgetperformupdatewithcompletionhandler(completionhandler: ((ncupdateresult) -> void)) {     // perform setup necessary in order update view.     // if error encountered, use ncupdateresult.failed     // if there's no update required, use ncupdateresult.nodata     // if there's 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) } 

the strange thing is:

  1. we haven't encountered crash issue while we're using our today extension (it should show unable load if today extension crashes)

  2. we didn't receive issue our users reporting today extension isn't working.

  3. we've found same crash log on our device, today extension working 1. described. , also, time of crash log recorded, i'm not using phone!

so we're guessing it's 「fake」crash, crash logged, extension didn't crashed.

does facing same issue? thank you!

answering own question,

@matt right, calling completionhandler when data fetch task completes, instead of call completionhandler @ last of widgetperformupdatewithcompletionhandler method.

i didn't receive crashes anymore, problem solved!


Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -