将 iOS 混合应用程序从 UIWebView 迁移到 WKWebview

Migrating iOS Hybrid App from UIWebView to WKWebview

我想将我的 iOS 混合应用程序从 UIWebView 迁移到 WKWebView,因为前者已被弃用。 Stack Overflow 上有许多与此类似的问题已经得到解答,但这些问题集中在更简单的主题上,即仅显示 Web 视图而不解决本地文件的加载问题,也没有解决 [=] 之间所需的双向交互64=] 包装器和 Javascript 混合应用程序交付任何功能的代码。

到目前为止,我已经确定我需要执行以下操作

  1. 将 UIKit 的导入语句替换为 WebKit。

  2. 在创建 wkwebview 之前,有必要创建一个配置对象并将其键 allowFileAccessFromFileURLs 设置为 TRUE。

  3. 创建 wkwebview 后,将其 navigationDelegate 和 UIDelegate 设置为 self。

  4. 加载html/ccc/js文件位置的url时,指定allowingReadAccessToURL删除最后一个路径部分(我认为是file://)

  5. 将 wkwebview 设置为主视图的子视图(我认为这在 UIWebView 中不需要)

  6. 通过在 2 中提到的 wkwebview 配置对象中创建脚本消息处理程序,将现有通信通道从 javascrtipt 代码替换为使用 "shouldStartLoadWithRequest" 的 Objective C 代码然后使用此消息处理程序调用以前由 "shouldStartLoadWithRequest".

  7. 完成的处理
  8. 将所有现有通信通道从 Objective C 代码替换为 javascript 代码,该代码使用 "stringByEvaluatingJavaScriptFromString" 和 "evaluateJavaScript",现在需要一个可以设置为 nil 的完成处理程序,因为我没有使用任何回调值。

  9. 添加一个解决方案以允许在用户不选择输入文本字段的情况下显示键盘。目前我能看到的最好的是 。我有点担心它似乎需要在每个 IOS 版本中进行更改。

  10. 解决 CORS 问题。我知道WKWebView在从不同的URL加载远程文件的实现上比UIWebView要严格得多,但我不清楚是否也需要将要加载的本地文件也列入白名单。

如果有人知道需要更改的检查清单 tips/examples 以及确切的详细信息,或者可以提供非常好的答案。

此外,我想通过为这些用户保留 UIWebView 来继续支持 IOS 11 之前的用户,因为我认为 WKWebView 在那些早期版本中存在问题。有谁知道这是否会导致任何其他问题需要解决,如果会如何解决?

  1. allowFileAccessFromFileURLs 未记录,因此它可能在 iOS 13.
  2. 中有效,也可能无效
  3. 是的,UIWebViews 也需要它。可能不同的是,将 WKWebView 添加到情节提要或笔尖是不可能的或有错误的,至少在 Xcode 的最新版本之前是这样,这可能就是您有这种印象的原因。
  4. 不,-webview:shouldStartLoadWithRequest:navigationType:方法是UIWebViewDelegate方法。你要对应的WKNavigationDelegate方法,也就是-webView:decidePolicyForNavigationAction:decisionHandler:.
  5. 我无法回答这个问题,因为我从来不需要这样做。
  6. 参见#8

WKWebView 自 iOS 8 以来一直存在,因此除非您的目标是 iOS 7,Apple 仍然可能会在开始拒绝使用 [=11 后拒绝您的应用=].我认为除了提交应用程序以了解情况外,没有其他方法可以知道是否属于这种情况。

如果您的 javascript 使用依赖于 webview 委托来正确处理它们的自定义方案(即 myscheme://some/callback),它可能与 Webkit 不兼容。这就是您提到的脚本消息处理程序的用武之地。但是您必须更新 javascript 以使用 window.webkit.messageHandlers.someCallback.postMessage(someParams) 而不是使用自定义 URL 方案。