Apple 是否离线测试 iOS 个应用程序?如果没有连接,如何处理错误?
Does Apple test iOS apps offline? How to handle error if no connection?
我已经向 iTunes 提交了一个应用程序,但 Apple 因崩溃而拒绝了它。
我对崩溃报告进行了符号化和分析,发现它在 json 调用时崩溃了。
我尝试重现它,我发现它只是在我关闭我的 wlan 时发生。
- Apple 是否离线测试应用程序?
- 我该如何处理这个错误?让我的 json 通话更好。
这是我的方法:
var session = NSURLSession.sharedSession();
var uri = "/GetNews";
let request : NSMutableURLRequest = CreateRequest(uri, HTTPmethod: "GET");
let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil;
let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: error) as? Dictionary<String, AnyObject>;
let resp : NewsResponse = NewsResponse(jsonData: jsonResult!);
completionHandler?(resp);
});
task.resume();
它在 let resp...
处崩溃,因为 jsonResult
为零,而我使用 !
当然,Apple 会离线测试应用程序,您也应该这样做。您应该计划每次需要互联网连接失败的呼叫,并且您应该适当地处理每个错误。
适当的部分取决于您的应用程序。例如,某些应用程序(如 Facebook)可让您阅读已下载的帖子,并将您撰写的帖子排队等待在连接到互联网时发送。有些应用程序在没有互联网连接的情况下根本无法运行,除了显示错误消息(例如,iTunes 收音机)之外,它们做任何事情都没有意义。
如果您的应用是新闻 reader,也许最好的做法是使用缓存并让他们阅读过去下载的新闻。一个简单的、不显眼的消息,让他们知道他们处于离线状态,并且一旦他们重新打开就会下载新文章就足够了;但是,就可用性和实用性而言,崩溃是非常糟糕的。
修复崩溃问题
正如埃里克所说,您应该使用“安全解包”,更广为人知的是可选绑定。试试这个:
var session = NSURLSession.sharedSession();
var uri = "/GetNews";
let request : NSMutableURLRequest = CreateRequest(uri, HTTPmethod: "GET");
let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil;
let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: error) as? Dictionary<String, AnyObject>;
//if non-nil, assigns jsonResult to nonNilJsonResult
if let nonNilJsonResult = jsonResult {
let resp : NewsResponse = NewsResponse(jsonData: nonNilJsonResult!);
completionHandler?(resp);
}
});
task.resume();
我已经向 iTunes 提交了一个应用程序,但 Apple 因崩溃而拒绝了它。
我对崩溃报告进行了符号化和分析,发现它在 json 调用时崩溃了。
我尝试重现它,我发现它只是在我关闭我的 wlan 时发生。
- Apple 是否离线测试应用程序?
- 我该如何处理这个错误?让我的 json 通话更好。
这是我的方法:
var session = NSURLSession.sharedSession();
var uri = "/GetNews";
let request : NSMutableURLRequest = CreateRequest(uri, HTTPmethod: "GET");
let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil;
let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: error) as? Dictionary<String, AnyObject>;
let resp : NewsResponse = NewsResponse(jsonData: jsonResult!);
completionHandler?(resp);
});
task.resume();
它在 let resp...
处崩溃,因为 jsonResult
为零,而我使用 !
当然,Apple 会离线测试应用程序,您也应该这样做。您应该计划每次需要互联网连接失败的呼叫,并且您应该适当地处理每个错误。
适当的部分取决于您的应用程序。例如,某些应用程序(如 Facebook)可让您阅读已下载的帖子,并将您撰写的帖子排队等待在连接到互联网时发送。有些应用程序在没有互联网连接的情况下根本无法运行,除了显示错误消息(例如,iTunes 收音机)之外,它们做任何事情都没有意义。
如果您的应用是新闻 reader,也许最好的做法是使用缓存并让他们阅读过去下载的新闻。一个简单的、不显眼的消息,让他们知道他们处于离线状态,并且一旦他们重新打开就会下载新文章就足够了;但是,就可用性和实用性而言,崩溃是非常糟糕的。
修复崩溃问题
正如埃里克所说,您应该使用“安全解包”,更广为人知的是可选绑定。试试这个:
var session = NSURLSession.sharedSession();
var uri = "/GetNews";
let request : NSMutableURLRequest = CreateRequest(uri, HTTPmethod: "GET");
let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil;
let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: error) as? Dictionary<String, AnyObject>;
//if non-nil, assigns jsonResult to nonNilJsonResult
if let nonNilJsonResult = jsonResult {
let resp : NewsResponse = NewsResponse(jsonData: nonNilJsonResult!);
completionHandler?(resp);
}
});
task.resume();