我的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()
}
即使您对代码没有任何想法,也很高兴知道可能导致再现差异的因素(操作系统,语言,设备,网络和类似的东西)。
答案 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;,你的代码可能会崩溃。