Apple 是否离线测试 iOS 个应用程序?如果没有连接,如何处理错误?

Does Apple test iOS apps offline? How to handle error if no connection?

我已经向 iTunes 提交了一个应用程序,但 Apple 因崩溃而拒绝了它。

我对崩溃报告进行了符号化和分析,发现它在 json 调用时崩溃了。

我尝试重现它,我发现它只是在我关闭我的 wlan 时发生。

  1. Apple 是否离线测试应用程序?
  2. 我该如何处理这个错误?让我的 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();