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

标签 ios json swift

我正在尝试验证我的应用程序收据,并已使用我在网上找到的一些代码成功完成了此操作。但是,我正在模拟用户在尝试验证收据时未连接到互联网的事件,并且在执行此操作时遇到崩溃。仅当我的设备未连接到互联网时,以下 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/

相关文章:

ios - UIButton 超出 View Controller 而没有裁剪到其边界

xcode - App Transport Security 策略要求使用安全连接

ios - 在 iOS 中使用什么来在预定时间显示消息?

ios - CollectionView 以 UIScrollView 作为单元格

php - 错误域=NSCocoaErrorDomain 代码=3840 JSONObject

javascript - Telegram API 返回 HTML 而不是 JSON

ios - 如何在 UIImageView 中使用界面构建器上的图像等 pod 资源?

ios - 使用 CH CSVParser 解析引用的 CSV

php json数组问题

ios - 从路径中减去多个重叠路径