0

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

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

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

  1. Apple 是否会离线测试应用程序?
  2. 我该如何处理这个错误?并使我的 jsoncall 更好。

这是我的方法:

    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是 nil 并且我使用!

4

2 回答 2

5

当然,Apple 会离线测试应用程序,您也应该这样做。您应该计划每次需要互联网连接失败的呼叫,并且应该适当地处理每个错误。

适当的部分取决于您的应用程序。例如,某些应用程序(如 Facebook)可让您阅读已下载的帖子,并将您撰写的帖子排队等待在您获得互联网连接时发送。有些应用程序在没有互联网连接的情况下根本无法运行,它们除了显示错误消息(例如,iTunes 收音机)之外,做任何事情都没有任何意义。

如果您的应用程序是新闻阅读器,也许最好的办法是使用缓存并让他们阅读他们过去下载过的新闻。一条简单、不显眼的消息让他们知道他们已离线并且一旦他们重新上线就会下载新文章就足够了;但是,就可用性和实用性而言,崩溃是非常糟糕的。

于 2015-06-25T15:12:30.423 回答
3

修复崩溃

正如 Eric 所说,您应该使用“安全展开”,也就是众所周知的可选绑定。尝试这个:

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();
于 2015-06-25T15:16:13.497 回答