ios - 如何检查 rtmp 或 hls url 是否存在,否则它们会在 swift 中给出 404 错误

标签 ios validation url rss swift2

我需要从 rss 中解析一些数据,并在 swift 2 中打开解析后的 rss 中的相关链接, 例如我想检查这个链接是否有效:

rtmp://185.23.131.187:1935/live/jomhori1

或者这个:

http://185.23.131.25/hls-live/livepkgr/_defint_/liveevent/livestream.m3u8

我检查 url 验证的代码:

let urlPath: String = "http://185.23.131.25/hls-live/livepkgr/_defint_/liveevent/livestream.m3u8"
                            let url: NSURL = NSURL(string: urlPath)!
                            let request: NSURLRequest = NSURLRequest(URL: url)
                            let response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil

                            var valid : Bool!

                            do {
                                _ = try NSURLConnection.sendSynchronousRequest(request, returningResponse: response)
                            } catch {
                                print("404")
                                valid = false
                            }

我在网上搜索过,但我发现的所有方法都对我的问题没有帮助。

最佳答案

@sschale 的回答很好,但 NSURLConnection 已被弃用,现在最好使用 NSURLSession。

这是我的 URL 测试类版本:

class URLTester {

    class func verifyURL(urlPath: String, completion: (isOK: Bool)->()) {
        if let url = NSURL(string: urlPath) {
            let request = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "HEAD"
            let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (_, response, error) in
                if let httpResponse = response as? NSHTTPURLResponse where error == nil {
                    completion(isOK: httpResponse.statusCode == 200)
                } else {
                    completion(isOK: false)
                }
            }
            task.resume()
        } else {
            completion(isOK: false)
        }
    }

}

然后通过调用带有尾随闭包的类方法来使用它:

URLTester.verifyURL("http://google.com") { (isOK) in
    if isOK {
        print("This URL is ok")
    } else {
        print("This URL is NOT ok")
    }
}

带有 URLSession 的 Swift 3.0

class URLTester {

  class func verifyURL(urlPath: String, completion: @escaping (_ isOK: Bool)->()) {
    if let url = URL(string: urlPath) {
      var request = URLRequest(url: url)
      request.httpMethod = "HEAD"
      let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
        if let httpResponse = response as? HTTPURLResponse, error == nil {
          completion(httpResponse.statusCode == 200)
        } else {
          completion(false)
        }
      })
      task.resume()
    } else {
      completion(false)
    }
  }
}

这比 your answer 好因为它只下载响应 header 而不是整个页面(另外,它更好,因为它是异步的)。

关于ios - 如何检查 rtmp 或 hls url 是否存在,否则它们会在 swift 中给出 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706958/

相关文章:

ios - 无法安装苹果 watch 应用程序

ios - 截取 tableview 的屏幕截图时如何包含导航栏

ios - Realm +地幔: how to avoid multiple inheritance duplication when integrating both frameworks?

ios - 从应用程序中存储的文本文件中读取数据的最佳方式

jquery - 重置 HTML5 无效输入状态

php - Laravel 5 验证唯一(数据库)仅适用于相同的外键

php - 是否应该在数据库级别处理唯一字段的验证?

java - 将 cURL 命令转换为纯 Java

java - 解析 URL 以获取 hyber 链接并将 hyber 链接存储在单独的变量中

html - 绕过阻止其 URL 包含嵌入式凭据的子资源请求