最终我的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联系我的本地机器?
如果您在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/")
}
}
}
正如评论中提到的,您需要确保在Info.plist
中将NSAllowsArbitraryLoads
设置为YES
。