EXC 错误指令错误

  • 本文关键字:错误 指令 EXC swift
  • 更新时间 :
  • 英文 :


我有一个名为EXC错误指令的错误。有人可以帮我弄清楚吗?插座面板上写着:

应用传输安全已阻止明文 HTTP (http://) 资源负载,因为它不安全。可以通过应用的 Info.plist 文件配置临时例外。致命错误:解开可选值时意外发现 nil

这是代码。

import Foundation
let kNotificationStocksUpdated = "stocksUpdated"
class StockManagerSingleton {
//Singleton Init
class var sharedInstance : StockManagerSingleton {
    struct Static {
        static let instance : StockManagerSingleton = StockManagerSingleton()
    }
    return Static.instance
}
/*!
* @discussion Function that given an array of symbols, get their stock prizes from yahoo and send them inside a NSNotification UserInfo
* @param stocks An Array of tuples with the symbols in position 0 of each tuple
*/
func updateListOfSymbols(stocks:Array<(String,Double)>) ->() {
    //1: YAHOO Finance API: Request for a list of symbols example:
    //http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN ("AAPL","GOOG","FB")&format=json&env=http://datatables.org/alltables.env
    //2: Build the URL as above with our array of symbols
    var stringQuotes = "(";
    for quoteTuple in stocks {
        stringQuotes = stringQuotes+"""+quoteTuple.0+"","
    }
    stringQuotes = stringQuotes.substringToIndex(stringQuotes.endIndex.predecessor())
    stringQuotes = stringQuotes + ")"
    let urlString:String = ("http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN "+stringQuotes+"&format=json&env=http://datatables.org/alltables.env").stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
    let url : NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL:url)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)
    //3: Completion block/Clousure for the NSURLSessionDataTask
    let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        do {
            if let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options:.MutableContainers) as? NSDictionary {
                // Success block...
                //5: Extract the Quotes and Values and send them inside a NSNotification
                let quotes:NSArray = ((jsonDict.objectForKey("query") as! NSDictionary).objectForKey("results") as! NSDictionary).objectForKey("quote") as! NSArray
                dispatch_async(dispatch_get_main_queue(), {
                    NSNotificationCenter.defaultCenter().postNotificationName(kNotificationStocksUpdated, object: nil, userInfo: [kNotificationStocksUpdated:quotes])
                })
            }
        } catch {
            print(error)
        }
    })

    //6: DONT FORGET to LAUNCH the NSURLSessionDataTask!!!!!!
    task.resume()
}
}

其中有问题的台词是,

if let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options:.MutableContainers) as? NSDictionary 

应用程序传输安全导致您的请求失败,因为您请求的 URL 不使用 https。然后在完成处理程序中,数据为 nil,这可能是导致异常的原因,因为您正在强制解包它。

在尝试使用它来阻止异常之前,需要添加检查以确保数据不为 nil。

若要使网络请求正常工作,需要使用 https URL 或禁用应用传输安全性

最新更新