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

标签 ios objective-c wkwebview hybrid-mobile-app

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

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

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

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

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

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

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

  6. 通过在上面 2 中提到的 wkwebview 配置对象中创建脚本消息处理程序,然后使用此消息处理程序来调用,将现有的通信 channel 从 javascrtipt 代码替换为使用“shouldStartLoadWithRequest”的 Objective C 代码过去由“shouldStartLoadWithRequest”完成的处理。

  7. 将所有现有的通信 channel 替换为 Objective C 代码中的 javascript 代码,该代码使用“stringByEvaluatingJavaScriptFromString”和“evaluateJavaScript”,现在需要一个完成处理程序,可以将其设置为 nil,因为我没有使用任何回调值(value)观。

  8. 添加一个解决方案,允许在用户不选择输入文本字段的情况下显示键盘。到目前为止我能看到的最好的是Programmatically focus on a form in a webview (WKWebView) .我有点担心它似乎需要更改每个 IOS 版本。

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

如果有人知道需要更改的事项的检查 list ,并提供带有确切详细信息的提示/示例,或者可以提供诸如答案之类的信息,那就太好了。

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

最佳答案

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

WKWebView 自 iOS 8 起就已存在,因此除非您的目标是 iOS 7,否则一旦 Apple 开始拒绝使用 UIWebView,Apple 仍可能会拒绝您的应用。我认为除了提交应用程序来查明情况之外,没有任何方法可以知道是否属于这种情况。

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

关于ios - 将 iOS 混合应用程序从 UIWebView 迁移到 WKWebview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58331247/

相关文章:

ios - WKWebView 确实从本地文档文件夹加载资源

ios - 如何在启用allowsLinkPreview 的情况下在同一个WKWebView 中打开3D touch 弹出页面?

ios - 如何从本周的工作日名称获取具体日期

ios - 如何在不知道索引的情况下检查对象是否存在于NSMutableArray中,并在iOS中将其替换(如果存在)?

ios - 如何根据暗/亮模式设置默认标签颜色(在 Swift 中)

iOS - 弹出 UIViewController 不会破坏其属性

ios - 尝试做一个简单的倒计时应用程序但计数器没有倒计时?

objective-c - 从 Objective C 到 Swift 的 Getter

objective-c - 在 iPhone 应用程序中动态更改 UI

javascript - 如何在 WKWebView 中将数据从 Javascript 传递到 Swift?