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

dea*_*904 3 macos ios swift swift4

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

但是我发现的只是目标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()
    }
Run Code Online (Sandbox Code Playgroud)

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

self.pingHost("https://www.google.com")
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

Col*_*aff 8

如果您要“ 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()
}
Run Code Online (Sandbox Code Playgroud)

(如果不在操场上跑步,请忽略操场上的东西。)

  • 错误可能不是由此代码引起的,除非是在错误处理中。实施不当的Web服务器可能无法正确处理HEAD方法,并且会执行诸如重置连接或返回错误状态之类的各种事情。我们无法解决某人可能处理HTTP请求的所有奇怪方法,我们所能做的就是防御错误的代码。 (2认同)
  • Ping 使用 TCP/IP 族的 ICMP 协议,该协议与 HTTP/HTTPS 完全无关且级别较低。使用 HEAD 请求 ping 主机需要大约 300 毫秒(_在我的情况下至少_)有没有办法可以在 swift 中使用 ICMP ping 主机?如果我没记错的话,通过 ICMP 进行 ping 操作将只需要 30-50 毫秒。 (2认同)

Ant*_*zik 6

我想问题很简单:您启用了App Sandbox没有检查 Outgoing Connections

你的pingHost方法怎么样- 它是完全正确的。所以我认为唯一的问题在于 App Sandbox 设置。

在此处输入图片说明