我正在尝试验证我的应用程序收据,并已使用我在网上找到的一些代码成功完成了此操作。但是,我正在模拟用户在尝试验证收据时未连接到互联网的事件,并且在执行此操作时遇到崩溃。仅当我的设备未连接到互联网时,以下 do/catch 方法才会导致 anyObj
行崩溃:
func validateRecipt(){ var 响应:NSURLResponse? var 错误:NSError?
var receipt: NSData = NSData()
if let url = NSBundle.mainBundle().appStoreReceiptURL {
if let appReceipt = NSData(contentsOfURL: url) {
print("Receipt Found")
receipt = appReceipt
}else {
print("Receipt not Found")
}
}else {
print("Could not load Receipt")
}
//https://buy.itunes.apple.com/verifyReceipt
let request = NSMutableURLRequest(URL: NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
let receiptdata:NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.EncodingEndLineWithLineFeed)
//NSLog("%@",receiptdata)
let payload:NSString = "{\"receipt-data\" : \"\(receiptdata)\"}"
let payloadData = payload.dataUsingEncoding(NSUTF8StringEncoding)
let err: NSError?
request.HTTPBody = payloadData
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
var err: NSError?
//let json = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
var json: AnyObject?
do {
let anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String:AnyObject]
****//App Crashes Here ^^//****
json = anyObj
} catch {
print("Fetch failed: \((error as NSError).localizedDescription)")
}
if(err != nil) {
print(err!.localizedDescription)
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Error could not parse JSON: '\(jsonStr)'")
}
else {
if let parseJSON = json {
print("Recipt \(parseJSON)")
print(parseJSON.count)
}
else {
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Recipt Error: \(jsonStr)")
}
print("You gets nathan")
}
})
task.resume()
}
崩溃只是 fatal error :在解包可选值时意外发现 nil
我无法理解 do/catch 方法,所以我不确定我是否完全理解这里发生的事情。所以我猜我的问题是当anyObj返回nil时如何避免崩溃?
最佳答案
我猜测调试器光标指向的行是:
let anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String:AnyObject]
...还有你的data
变量为零(即,可选不包含任何值)。在强制展开之前检查(!
运算符)。
((error as NSError).localizedDescription
不可能,因为错误在 catch
block 内应该是非零,并且我认为未能区分 NSError
会给出不同的错误消息)。
编辑:
这就是安全打开包装的方法:
if let safeData = data { // <-- YOU NEED TO DO THIS
// data is 'NSData?', safeData is 'NSData'.
// If data contained any value, it is now assigned to safeData.
// Use safeData as the source of your JSON (**not** data).
}
else{
print("error: data is nil!")
}
关于ios - NSJSONSerialization 在验证应用程序收据时导致 Swift 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35167291/