ios - 使用 Swift 4 ping 网站或 IP 地址(或检查网站是否在线)?

标签 ios swift macos swift4

从昨天开始,我一直在寻找一种更简单的解决方案,只需 ping 一个网站并检查它是否在 Swift 中返回 200。

但我所找到的只是 Objective C 中的解决方案。

在 Swift 中,我找到了一些答案,例如

func pingHost(_ fullURL: String) {
        let url = URL(string: fullURL)

        let task = URLSession.shared.dataTask(with: url!) { _, response, _ in
            if let httpResponse = response as? HTTPURLResponse {
                print(httpResponse.statusCode)
            }
        }

        task.resume()
    }

但是当我从其他函数调用它时,比如

self.pingHost("https://www.google.com")

它给出了奇怪的错误,比如

2018-09-26 12:46:34.076938+0530 Net Alert[1608:52682] dnssd_clientstub ConnectToServer: connect()-> No of tries: 1
2018-09-26 12:46:35.082274+0530 Net Alert[1608:52682] dnssd_clientstub ConnectToServer: connect()-> No of tries: 2
2018-09-26 12:46:36.083497+0530 Net Alert[1608:52682] dnssd_clientstub ConnectToServer: connect()-> No of tries: 3
2018-09-26 12:46:37.083964+0530 Net Alert[1608:52682] dnssd_clientstub ConnectToServer: connect() failed path:/var/run/mDNSResponder Socket:5 Err:-1 Errno:1 Operation not permitted
2018-09-26 12:46:37.084497+0530 Net Alert[1608:52682] [] nw_resolver_create_dns_service_locked [C1] DNSServiceCreateDelegateConnection failed: ServiceNotRunning(-65563)
2018-09-26 12:46:37.087264+0530 Net Alert[1608:52682] TIC TCP Conn Failed [1:0x600003706e80]: 10:-72000 Err(-65563)
2018-09-26 12:46:37.088841+0530 Net Alert[1608:52673] Task <2B08658D-5DFA-48E9-A306-A47ED130DD1F>.<1> HTTP load failed (error code: -1003 [10:-72000])
2018-09-26 12:46:37.088990+0530 Net Alert[1608:52673] Task <2B08658D-5DFA-48E9-A306-A47ED130DD1F>.<1> finished with error - code: -1003

我如何在 Swift 4 中简单地 ping 并检查它是否返回 200?

最佳答案

如果您要“ping”一个网站,您需要使用 HEAD 请求而不是 GET 请求。要查看网站是否正常运行,您不需要整个网站,只需标题即可。它将节省时间和带宽:

import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

if let url = URL(string: "https://apple.com") {
  var request = URLRequest(url: url)
  request.httpMethod = "HEAD"

  URLSession(configuration: .default)
    .dataTask(with: request) { (_, response, error) -> Void in
      guard error == nil else {
        print("Error:", error ?? "")
        return
      }

      guard (response as? HTTPURLResponse)?
        .statusCode == 200 else {
          print("down")
          return
      }

      print("up")
    }
    .resume()
}

(如果不是在 Playground 上运行,请忽略 Playground 上的东西。)

关于ios - 使用 Swift 4 ping 网站或 IP 地址(或检查网站是否在线)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52512244/

相关文章:

ios - Swift 汇总 respondsToSelector() 和 sizeWithFont()

ios - 允许访问 Health : how can I know in my app that the user enabled/disabled it later?

c++ - Xcode/Clang 魔法数字?

Eclipse Juno 在 OS X Lion 上打字延迟

ios - 由于异步,在发布后连接到 MQTT

ios - iOS Swift 中简单的低延迟音频播放

ios - 在 iOS 中获取谷歌地图中的可访问标记

python - 在mac上使用python访问外部硬盘驱动器中的文件

ios - 在 TableView 使可重用单元出列之前,静态 TableView 中的动态文本无法正确显示

ios - iOS 中的 CGContextRef 内存泄漏