返回

如何让 Webview iOS 应用动态响应 Deeplink 链接?

IOS

使用 Deeplink 赋能你的 Webview iOS 应用程序

问题陈述

在你的 iOS 应用程序中实现 Deeplink 时,遇到困难了吗?你是不是发现,即使应用程序已安装,初始加载的网页仍是固定的,而无法动态响应点击的链接?如果是这样,那么这篇文章将为你提供一个全面的解决方案,让你能够在 Webview iOS 应用程序中动态使用 Deeplink。

解决方法

要解决此问题,需要遵循以下四个步骤:

  1. 配置苹果关联文件: 在服务器上创建一个 apple-app-site-association 文件,将你的域名与应用程序关联起来。
  2. 处理 Deeplink URL: 在 AppDelegate 中处理传入的 Deeplink,并从中提取 URL。
  3. 加载 Deeplink URL: 在 Webview 控制器中加载提取的 Deeplink URL,使其在 Webview 中显示。
  4. 管理 Webview 导航: 处理 Webview 中的导航,允许用户在 Webview 中打开新链接。

步骤详解

1. 创建苹果关联文件

使用上述提供的示例,创建一个 apple-app-site-association 文件并将其放置在你的服务器上。确保将 appIDs 替换为你的应用程序的包标识符。

2. 处理 Deeplink URL

在 AppDelegate.swift 文件中,添加以下代码:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let url = userActivity.webpageURL else {
        return false
    }
    let universalURL = url.absoluteString
    // 在此处理 universalURL
    return true
}

3. 加载 Deeplink URL

在 AbcViewController.swift 文件中,添加以下代码:

override func viewDidLoad() {
    // 从 AppDelegate 获取 Deeplink URL
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let universalURL = appDelegate.universalLinkURL
    
    // 如果有 Deeplink URL,则加载它
    if !universalURL.isEmpty {
        let url = URL(string: universalURL)
        webView.load(URLRequest(url: url!))
    }
}

4. 管理 Webview 导航

在 AbcViewController.swift 文件中,添加以下代码:

extension AbcViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        // 处理导航操作
        decisionHandler(.allow)
    }
}

附加提示

  • 确保在应用程序的 Info.plist 文件中设置 Universal Links 权限。
  • 在 Webview 中打开新链接时,使用 WKNavigationActionPolicy.allow 允许导航操作。
  • 使用 WKWebView 的 loadRequest() 方法加载 Deeplink URL,而不是 load() 方法。

结论

通过遵循这些步骤,你可以使你的 Webview iOS 应用程序能够动态使用 Deeplink。这将大大提升用户体验,让他们可以无缝地在你的应用程序和外部网站之间切换。

常见问题解答

1. 如何处理多个 Deeplink?

在 AppDelegate 中,可以将收到的 Deeplink 存储在一个数组中,并在需要时对其进行处理。

2. 如何在 Webview 中打开特定的页面?

可以通过设置 WKWebView 的 URLRequest 的 URL 来在 Webview 中打开特定的页面。

3. 如何防止 Webview 打开外部应用程序?

在 WKNavigationDelegate 中,可以通过检查 navigationAction.request.url 是否属于应用程序的域名来防止 Webview 打开外部应用程序。

4. 如何在 Webview 中处理表单提交?

可以使用 WKWebView 的 evaluateJavaScript() 方法在 Webview 中处理表单提交。

5. 如何调试 Deeplink 集成?

可以使用 Safari 中的 Web Inspector 来调试 Deeplink 集成。