【问题标题】:Pinging localhost in Swift w/ Xcode使用 Xcode 在 Swift 中 Ping localhost
【发布时间】:2021-12-14 05:00:03
【问题描述】:

最终,我的 Swift 前端将对外部服务器进行 API 调用,但在开发过程中,我想在我的计算机上进行本地测试。如何从 Xcode 访问我的本地主机服务器?在这一点上,我只是想确保联系——我还不需要真正检索任何东西。

到目前为止,我有以下代码:

let urlString = "MY_IP_ADDRESS"
let url = URL(string: urlString)!

do {
    try url.checkResourceIsReachable()
    print("Success!")
} catch {
    print("Failure!")
}

urlString 变量中,我尝试了我的实际IP 地址。我还尝试了localhost:4001/hello,其中 4001 是我的 node.js 服务器正在侦听的端口,我定义了/hello。是我使用了错误的地址、错误的代码,还是无法从 Xcode 联系我的本地机器?

【问题讨论】:

  • 本地主机或 127.0.0.1
  • 您是否指定了协议?你的 url 开头应该有 http 什么的……
  • @jnpdx 一个方案
  • 一个URL由scheme、host、port、path、query等组成。scheme是冒号“:”前的部分。常见的方案包括“http”。 “https”、“file”、“mailto”等。您的 URL 字符串不包含方案(localhost:4001/hello 除外,其中方案是“localhost”)。您可以使用 URL“localhost”或“127.0.0.1”访问本地计算机上的 Web 服务器(如果正在运行)。但如果没有方案,您就没有有效的 URL。
  • 如@ScottThompson 所述,假设您的本地服务器正在为http 提供服务,请在您的网址中添加一个方案,例如http://localhost:4001/hello

标签: ios node.js swift api request


【解决方案1】:

如果您在 catch 块中使用 print(error)(这始终是一个好习惯——print("Failure!") 不会告诉您为什么调用了 catch 块),您将注意有一个错误告诉你:

无法打开文件,因为指定的 URL 类型不受支持。

虽然没有明确说明,但我认为这里的含义是 checkResourceIsReachable 用于文件系统 URL——而不是远程 http 请求。

相反,使用一个系统来验证远程资源的 URL 是否可访问。

import SwiftUI
import Combine

class CheckURL : ObservableObject {
    enum URLResult : String {
        case unknown, unreachable, reachable
    }
    
    @Published var urlReachable : URLResult = .unknown
    private var cancellable : AnyCancellable?
    
    func verifyURL(urlPath: String) {
        guard let url = URL(string: urlPath) else {
            assertionFailure("Invalid URL")
            self.urlReachable = .unknown
            return
        }
        
        var request = URLRequest(url: url)
        request.httpMethod = "HEAD"
        
        cancellable = URLSession.shared.dataTaskPublisher(for: url).tryMap({ (_ , response: URLResponse) -> URLResult in
            if let response = response as? HTTPURLResponse, response.statusCode == 200 {
                return .reachable
            } else {
                return .unreachable
            }
        })
        .replaceError(with: .unreachable)
        .receive(on: RunLoop.main).sink { result in
            self.urlReachable = result
        }
    }
}

struct ContentView : View {
    @StateObject private var urlChecker = CheckURL()
    
    var body: some View {
        Text("Reachable? \(urlChecker.urlReachable.rawValue)")
            .onAppear {
                    urlChecker.verifyURL(urlPath: "http://localhost:4001/")
            }
    }
}

如 cmets 中所述,您需要确保在 Info.plist 中将 NSAllowsArbitraryLoads 设置为 YES

【讨论】:

  • 我的 Xcode 找不到 AnyCancellable?。需要为此导入一个包吗?
  • 是 -- import Combine
  • 好的,我做到了,它成功了!
  • 我需要检查你的代码并了解发生了什么,但我肯定能够连接到我的本地 node.js 服务器
  • 它所做的只是向 URL 发送一个HEAD http 请求。如果它收到 200 响应,则表示它是可访问的。如果没有,则无法访问。您可以通过对不同的错误代码等做出不同的响应来使其更加健壮,但这似乎足以让您仅查看是否可以连接到 URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2016-10-16
  • 2016-09-14
  • 1970-01-01
  • 2020-08-26
  • 2022-11-06
相关资源
最近更新 更多