【问题标题】:Downloading web content with Swift 3使用 Swift 3 下载网页内容
【发布时间】:2018-01-15 12:36:46
【问题描述】:

我正在尝试为我正在制作的天气应用下载网页内容。当我运行应用程序时,网站上的源代码不会出现在我的 Xcode 上。我还更新了我的 info.plist 以接受网络内容。

您是否知道问题是什么以及如何解决?

我在下面复制了我的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    let url = NSURL(string: "http://weather.weatherbug.com/weather-forecast/now/abuja")!
    let request = NSMutableURLRequest(url:url as URL)
    let task = URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in

        if error != nil{
            print(error.debugDescription)
        }
        else {
            if let unwrappedData = data{

                let dataString = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue)

                print(dataString as Any)
            }
        }
    }

    task.resume()
}

【问题讨论】:

  • 您是否关闭了域的 ATS?
  • 您的牙套不匹配。已编辑。

标签: ios swift webcontent


【解决方案1】:

将您的网址更改为使用 https,它应该可以工作。

let url = NSURL(string: "https://weather.weatherbug.com/weather-forecast/now/abuja")!

【讨论】:

  • 这不起作用,因为该网站特别使用 http。
  • 我在您的代码中显示的网站对其进行了测试,它与 https 一起使用,但也许您使用的 url 与显示的不同。
  • 我刚刚使用了 https。问题是,在打印网站的源代码时,它告诉的是我用于故事板的约束,而这并不重要
  • 好吧,我不知道它为什么要为你这样做。当我使用 https 尝试您的代码时,我在控制台中打印了 html 源代码。
【解决方案2】:

以下是 Swift 4 中用于下载文档并解析为 JSON 的示例:

// If you're doing this in an Xcode Playground, uncomment these lines:
// import XCPlayground
// XCPSetExecutionShouldContinueIndefinitely()

let url = URL(string: "http://json-schema.org/example/geo.json")!
let task = URLSession.shared.dataTask(with: url) {
    data, response, error in

    guard error == nil else { return }
    guard data != nil else { return }
    guard (response as? HTTPURLResponse)?.statusCode == 200 else { return }

    do {
        if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any] {
            print(json)
        }
    } catch { return }
}

task.resume()

【讨论】:

    【解决方案3】:

    使用“if let”而不是只使用“let”,它应该可以工作。

     if  let url = URL(string:"http://weather.weatherbug.com/weather-forecast/now/abuja"){
    
            let request = NSMutableURLRequest(url: url)
    
            let task = URLSession.shared.dataTask(with: request as URLRequest){
    
                data, responds, error in
                if error != nil{
                    print(error!)
    
                } else {
                    if let unwrappedData = data {
    
                        let dataString = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue)
    
                        print(dataString!)
    
                        DispatchQueue.main.sync(execute: {
    
                        })
                    }
                }
    
            }
    
    
    
            task.resume()
         }
    

    【讨论】:

    • 添加有关您的答案的更多信息并尝试解释您的代码。
    • 永远不要在 Swift 中使用 NS(Mutable)... 类,如果有对应的原生类。无论如何,该请求毫无意义,因为dataTask 也可以获取 URL。
    【解决方案4】:

    使用

    let myURLString = "http://weather.weatherbug.com/weather-forecast/now/abuja"
    guard let myURL = URL(string: myURLString) else {
        print("Error: \(myURLString) doesn't seem to be a valid URL")
        return
    }
    
    do {
        let myHTMLString = try String(contentsOf: myURL, encoding: .ascii)
        print("HTML : \(myHTMLString)")
    } catch let error {
        print("Error: \(error)")
    }
    

    来自Link

    【讨论】:

    • 不,不要这样做。在主队列上从 Internet 同步加载数据是非常非常糟糕的。
    • 当我尝试这一步时,并没有打印出网站源代码,而是打印出我应该更改约束的原因
    • 请给出控制台打印的内容
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2014-01-05
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多