前言
在Swift中,用Safari打开URL比较简单。但是这都是get请求。
假如我们需要用post请求先load Html页面,该如何处理呢?
let url = URL(string: "https://www.baidu.com") //根据iOS系统版本,分别处理 if #available(iOS 10, *) { // get打开 UIApplication.shared.open(url!, options: [:], completionHandler: {(success) in print(success) }) } else { // get打开 UIApplication.shared.openURL(url!) }
解决方案
我们可以通过webView来解决,方案如下:
wkWebView post加载网页 –> wkWebView加载完成后,获取wkWebView的url –> 通过浏览器打开url
struct WebView: UIViewRepresentable { var url: String var text: String func makeUIView(context: Context) -> WKWebView { guard let url = URL(string: url) else { return WKWebView() } // 通过wkWebView Post loadHtml页面。 let wkWebView = WKWebView() wkWebView.navigationDelegate = context.coordinator var request = URLRequest(url: url) request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" let parameters = ["text": text] as [String: Any] let httpBodyData = try? JSONSerialization.data(withJSONObject: parameters, options: []) request.httpBody = httpBodyData wkWebView.load(request) return wkWebView } func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<WebView>) {} func makeCoordinator() -> WebView.Coordinator { Coordinator(self) } class Coordinator: NSObject, WKNavigationDelegate { var control: WebView init(_ control: WebView) { self.control = control } func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { NotificationCenter.default.post(name: .loadWebPageError, object: error.localizedDescription, userInfo: nil) } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { if let url = webView.url?.absoluteString { print("url = \(url)") // 获取加载后的HTML的url,并且发送出去。 NotificationCenter.default.post(name: .loadWebPageFinish, object: url, userInfo: nil) } } } }
// 引用WebViewPost加载页面 WebView(url: "https://xxxxxxxxxxx", text: "test").frame(width: 1, height: 1).zIndex(1)
struct XXXXXXXView: View { var loadWebPageFinish = NotificationCenter.default.publisher(for: .loadWebPageFinish) var loadWebPageError = NotificationCenter.default.publisher(for: .loadWebPageError) var body: some View { VStack(spacing: 0) { } }.onReceive(loadWebPageFinish) { param in // 这里面获取到webview的url, 用浏览器打开。 let url = URL(string: param.object as! String) UIApplication.shared.open(url!, options: [:], completionHandler: { _ in }) } } }