使用 Crashlytics 错误日志修复我的崩溃
Fixing my crash using Crashlytics error logs
我收到 Crashlytics 的错误日志,内容如下:
Crashed: NSOperationQueue 0x1d003d5a0 (QOS: UNSPECIFIED)
0 (App Name) 0x100710fa4 specialized ViewController.(getHistoricalData(url : String, currency : String) -> ()).(closure #1) (ViewController.swift:1324)
1 (App Name) 0x1007029f8 ViewController.(getHistoricalData(url : String, currency : String) -> ()).(closure #1) (ViewController.swift)
2 (App Name) 0x100712178 partial apply for ViewController.(getHistoricalData(url : String, currency : String) -> ()).(closure #1) (ViewController.swift)
3 (App Name) 0x1006fd448 @callee_owned (@owned Data?, @owned URLResponse?, @owned Error?) -> ()NSData?NSData (ViewController.swift)
4 CFNetwork 0x181fd1d68 __75-[__NSURLSessionLocal taskForClass:request:uploadFile:bodyData:completion:]_block_invoke + 32
5 CFNetwork 0x181fea6bc __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 152
6 Foundation 0x18241dba0 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 16
7 Foundation 0x18235d894 -[NSBlockOperation main] + 72
8 Foundation 0x18234d4c4 -[__NSOperationInternal _start:] + 848
9 libdispatch.dylib 0x1813c6a14 _dispatch_client_callout + 16
10 libdispatch.dylib 0x1814029c4 _dispatch_block_invoke_direct$VARIANT$armv81 + 280
11 libdispatch.dylib 0x1813c6a14 _dispatch_client_callout + 16
12 libdispatch.dylib 0x1814029c4 _dispatch_block_invoke_direct$VARIANT$armv81 + 280
13 libdispatch.dylib 0x181402878 dispatch_block_perform$VARIANT$armv81 + 104
14 Foundation 0x18241f878 __NSOQSchedule_f + 376
15 libdispatch.dylib 0x1813c6a14 _dispatch_client_callout + 16
16 libdispatch.dylib 0x181403640 _dispatch_continuation_pop$VARIANT$armv81 + 420
17 libdispatch.dylib 0x181401fe8 _dispatch_async_redirect_invoke$VARIANT$armv81 + 596
18 libdispatch.dylib 0x1814082a4 _dispatch_root_queue_drain + 568
19 libdispatch.dylib 0x181408008 _dispatch_worker_thread3 + 112
20 libsystem_pthread.dylib 0x18166f06c _pthread_wqthread + 1268
21 libsystem_pthread.dylib 0x18166eb6c start_wqthread + 4
其中 (App Name)
对应于我的应用名称。据我了解,错误发生在函数 getHistoricalData(url : String, currency : String)
的 ViewController.swift 的第 1324 行。
其功能如下:
func getHistoricalData(url: String, currency: String){
var Currenturl = NSURL(string: url)
if Reachability.isConnectedToNetwork() {
URLSession.shared.dataTask(with: (Currenturl as URL?)!, completionHandler: {(data, response, error) -> Void in
let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
if let jsonObj = jsonObj {
// do some stuff
}
}).resume()
}
}
1324行对应let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
我已经尝试了几种不同的解包方法 jsonObj
来尝试阻止这次崩溃。最初我有类似 if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
的东西,但发生了同样的问题。
是不是和我的拆包方式有关?任何 ideas/pointers 将不胜感激!
如果错误在let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
,有两个简单的错误原因:
- 转换为
NSDictionary
出于某种原因失败
- 强制展开
data
失败。
不要force-unwrap server-received数据使用!
,可能是nil。请改用以下代码:
guard let data = data, let jsonObj = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary else { // Handle error here }
我收到 Crashlytics 的错误日志,内容如下:
Crashed: NSOperationQueue 0x1d003d5a0 (QOS: UNSPECIFIED)
0 (App Name) 0x100710fa4 specialized ViewController.(getHistoricalData(url : String, currency : String) -> ()).(closure #1) (ViewController.swift:1324)
1 (App Name) 0x1007029f8 ViewController.(getHistoricalData(url : String, currency : String) -> ()).(closure #1) (ViewController.swift)
2 (App Name) 0x100712178 partial apply for ViewController.(getHistoricalData(url : String, currency : String) -> ()).(closure #1) (ViewController.swift)
3 (App Name) 0x1006fd448 @callee_owned (@owned Data?, @owned URLResponse?, @owned Error?) -> ()NSData?NSData (ViewController.swift)
4 CFNetwork 0x181fd1d68 __75-[__NSURLSessionLocal taskForClass:request:uploadFile:bodyData:completion:]_block_invoke + 32
5 CFNetwork 0x181fea6bc __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 152
6 Foundation 0x18241dba0 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 16
7 Foundation 0x18235d894 -[NSBlockOperation main] + 72
8 Foundation 0x18234d4c4 -[__NSOperationInternal _start:] + 848
9 libdispatch.dylib 0x1813c6a14 _dispatch_client_callout + 16
10 libdispatch.dylib 0x1814029c4 _dispatch_block_invoke_direct$VARIANT$armv81 + 280
11 libdispatch.dylib 0x1813c6a14 _dispatch_client_callout + 16
12 libdispatch.dylib 0x1814029c4 _dispatch_block_invoke_direct$VARIANT$armv81 + 280
13 libdispatch.dylib 0x181402878 dispatch_block_perform$VARIANT$armv81 + 104
14 Foundation 0x18241f878 __NSOQSchedule_f + 376
15 libdispatch.dylib 0x1813c6a14 _dispatch_client_callout + 16
16 libdispatch.dylib 0x181403640 _dispatch_continuation_pop$VARIANT$armv81 + 420
17 libdispatch.dylib 0x181401fe8 _dispatch_async_redirect_invoke$VARIANT$armv81 + 596
18 libdispatch.dylib 0x1814082a4 _dispatch_root_queue_drain + 568
19 libdispatch.dylib 0x181408008 _dispatch_worker_thread3 + 112
20 libsystem_pthread.dylib 0x18166f06c _pthread_wqthread + 1268
21 libsystem_pthread.dylib 0x18166eb6c start_wqthread + 4
其中 (App Name)
对应于我的应用名称。据我了解,错误发生在函数 getHistoricalData(url : String, currency : String)
的 ViewController.swift 的第 1324 行。
其功能如下:
func getHistoricalData(url: String, currency: String){
var Currenturl = NSURL(string: url)
if Reachability.isConnectedToNetwork() {
URLSession.shared.dataTask(with: (Currenturl as URL?)!, completionHandler: {(data, response, error) -> Void in
let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
if let jsonObj = jsonObj {
// do some stuff
}
}).resume()
}
}
1324行对应let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
我已经尝试了几种不同的解包方法 jsonObj
来尝试阻止这次崩溃。最初我有类似 if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
的东西,但发生了同样的问题。
是不是和我的拆包方式有关?任何 ideas/pointers 将不胜感激!
如果错误在let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
,有两个简单的错误原因:
- 转换为
NSDictionary
出于某种原因失败 - 强制展开
data
失败。
不要force-unwrap server-received数据使用!
,可能是nil。请改用以下代码:
guard let data = data, let jsonObj = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary else { // Handle error here }