swiftui - WKWebView 自定义链接可在 SwiftUI 中打开 WhatsApp 等应用程序

标签 swiftui xcode12

您好,我有以下代码可以在 SwiftUI Xcode 12 中加载网页,一切都加载得很好,但是电话链接和 WhatsApp 链接不起作用,我该怎么办?

这是我的 browser.swift 文件:

import Foundation
import SwiftUI
import WebKit

struct WebView: UIViewRepresentable{
    var url: String
    func makeUIView(context: Context) -> some WKWebView {
        guard let url = URL(string: self.url) else {
            return WKWebView()
        }
        let request = URLRequest(url: url)
        let wkWebView = WKWebView()
        wkWebView.load(request)
        return wkWebView
    }
    func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<WebView>) {
        
    }
    
}

这是我的 contentview.swift:

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
        Color(UIColor(red: 0.89, green: 0.98, blue: 0.88, alpha: 1.00))
                                .ignoresSafeArea()
                            
        WebView(url: "https://dominio.com/app/ios/index.php?idE=17")
            
        }
    }
}



struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

最佳答案

您需要实现WKNavigationDelegateWKUIDelegate

func makeUIView(context: Context) -> some WKWebView {
    guard let url = URL(string: self.url) else {
        return WKWebView()
    }
    
    let request = URLRequest(url: url)
    let wkWebView = WKWebView()
    
    wkWebView.navigationDelegate = context.coordinator //<<Add your delegates here
    wkWebView.uiDelegate = context.coordinator //<<Add your delegates here

    wkWebView.load(request)
    return wkWebView
}

添加您的协调器功能

func makeCoordinator() -> Coordinator {
    Coordinator()
}

在 Coordinator 类

class Coordinator: NSObject, WKNavigationDelegate, WKUIDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
    {
        if navigationAction.targetFrame == nil {
            webView.load(navigationAction.request)
        }
        
        if navigationAction.request.url?.scheme == "tel" {
            UIApplication.shared.openURL(navigationAction.request.url!)
            decisionHandler(.cancel)
        }
        else if navigationAction.request.url?.scheme == "mailto" {
            UIApplication.shared.openURL(navigationAction.request.url!)
            decisionHandler(.cancel)
        } else {
            decisionHandler(.allow)
        }
    }
}

确保在真实设备上进行测试

关于swiftui - WKWebView 自定义链接可在 SwiftUI 中打开 WhatsApp 等应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65332130/

相关文章:

ios - 增加View的点击目标而不改变位置

ios - 在 Swift 中更新变量之前数组正在更新

macos - macOS 的 SwiftUI - 触发表 .onDismiss 问题

ios - 使用空的 LLDB 目标可能会导致从远程设备读取内存缓慢

firebase - Xcode 12 : How to fix the error 'archiveRootObject:toFile:' is deprecated

Xcode 12. 类型 'AVCapturePhotoOutput' 的值没有成员 'supportedFlashModes'

ios - 当我们在文本和图像之间切换按钮内容时,如何阻止 SwiftUI 更改固定填充?

swift - 是否有 SwiftUI "drag enter"手势?

Xcode 显示 "The document had 4 issues that were found and repaired./Multiple resources have the same name: groupTableViewBackgroundColor."警报

swift - 'UIPastebaord.general.hasStrings' 不适用于 iOS 14.0