gpt4 book ai didi

ios - 验证应用收据时 NSJSONSerialization 在 Swift 中导致崩溃

转载 作者:可可西里 更新时间:2023-11-01 01:37:27 25 4
gpt4 key购买 nike

我正在尝试验证我的应用收据,并已使用我在网上找到的一些代码成功完成了验证。但是,我正在模拟用户在尝试验证收据时未连接到互联网并且在这样做时遇到崩溃的事件。仅当我的设备未连接到互联网时,以下 do/catch 方法才会在 anyObj 行导致崩溃:

函数 validateRecipt(){ var 响应:NSURLResponse? 变种错误: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 变量为 nil(即,optional 不包含任何值)。在强制展开之前检查(! 运算符)。

((error as NSError).localizedDescription 不可能,因为 error 在 catch block 中应该是非 nil 并且无法区分大小写 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com