斯威夫特 - 无法弄清楚崩溃的因素

时间:2015-07-31 12:51:10

标签: ios swift crash-reports

我的iOS应用程序(myapp)最终被拒绝了5次。 "崩溃"它被拒绝5次的原因,但我还没有复制它。我的环境和Apple之间必定存在某种差异(区域设置,语言设置,网络速度,iOS版本等),所以我尽可能地检查它们,但它还没有复制。 来自Apple的崩溃日志如下。

Thread 3 name:  Dispatch queue: NSOperationQueue 0x17443a560 :: NSOperation 0x170251b20 (QOS: LEGACY)
Thread 3 Crashed:
0   myapp   0x00000001000df17c   myapp.ViewController.(myFunction (myapp.ViewController) -> () -> ()).(closure #1) (ViewController.swift:0)
1   myapp   0x00000001000d5948   partial apply forwarder for reabstraction thunk helper from @callee_owned (@in (ObjectiveC.NSData!, ObjectiveC.NSURLResponse!, ObjectiveC.NSError!)) -> (@out ()) to @callee_owned (@owned ObjectiveC.NSData!, @owned ObjectiveC.NSURLResponse!, @owned ObjectiveC.NSError!) -> (@unowned ()) (ViewController.swift:0)

你有什么想法吗? 代码的主要部分如下。

func myFunc(){
    /*
        networkconditionIsOK ... IJReachability.swift
        https://github.com/Isuru-Nanayakkara/IJReachability
    */
    if self.networkConditionIsOK == false{
        return
    }
    let parameter = "q=hello"
    var strData = parameter.dataUsingEncoding(NSUTF8StringEncoding)
    var url = NSURL(string:"https://myserver.php")
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let userPasswordString = "id:pass"
    let userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding)
    let base64EncodedCredential = userPasswordData!.base64EncodedStringWithOptions(nil)
    let authString = "Basic \(base64EncodedCredential)"
    config.HTTPAdditionalHeaders = ["Authorization" : authString]
    let session = NSURLSession(configuration: config)
    var request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    request.HTTPBody = parameter.dataUsingEncoding(NSUTF8StringEncoding)
    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error in
        if error == nil {
            var myData:NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
            /*
                json ... using SwiftyJSON.swift
                https://github.com/SwiftyJSON/SwiftyJSON
            */
            let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as! NSDictionary
            let json = JSON(jsonDict)
            if(json["id"].count > 0){
                for i in 0 ..< json["id"].count {
                    let idFromServer = json["id"][i].stringValue
                    println("\(idFromServer)")
                }
            }
        } else {
            println(error)
        }
    })
    task.resume()
}

即使您对代码没有任何想法,也很高兴知道可能导致再现差异的因素(操作系统,语言,设备,网络和类似的东西)。

2 个答案:

答案 0 :(得分:0)

我重构了您的函数,以便删除与nil值相关的所有潜在崩溃。

func myFunc(){      
    if self.networkConditionIsOK == false {
        return
    }

    let parameter = "q=hello"
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let userPasswordString = "id:pass"

    if let
        userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding),
        url = NSURL(string:"https://myserver.php") {
            let base64EncodedCredential = userPasswordData.base64EncodedStringWithOptions(nil)
            let authString = "Basic \(base64EncodedCredential)"
            config.HTTPAdditionalHeaders = ["Authorization" : authString]
            let session = NSURLSession(configuration: config)
            var request = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "POST"
            request.HTTPBody = parameter.dataUsingEncoding(NSUTF8StringEncoding)

            var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error in
                if let
                    data = data,
                    dict = JSON(data:data)["id"].dictionary
                    where error == nil {
                        for idFromServer in (dict.values.array.map { return $0.string }) {
                            println(idFromServer)
                        }                           
                } else {
                    println(error)
                }
            })
            task.resume()
    }
}

现在这个功能应该是免费的。如果它通过了下一个App Store评论,请告诉我,我很好奇。

答案 1 :(得分:0)

我会对此非常怀疑:

var url = NSURL(string:"https://myserver.php")

这是您本地网络上的某个服务器吗?在这种情况下,它不会出现在Apple的本地网络上,也不会出现在任何其他人的本地网络上。

也许Apple刚刚尝试过当你在一个专属网络时会发生什么。在手机上安装您的应用程序,然后步行到下一个星巴克并尝试一下。当您要求提供JSON字典时,您假设您获得了JSON字典是非常非常乐观的。在那个星巴克咖啡馆,你会得到一个HTML,上面写着&#34;请登录我们的星巴克网站使用免费的WiFi&#34;,你的代码可能会崩溃。

相关问题