【问题标题】:Migrating iOS Hybrid App from UIWebView to WKWebview将 iOS Hybrid App 从 UIWebView 迁移到 WKWebview
【发布时间】:2019-10-10 21:19:57
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

如果有人知道需要更改的事项清单,其中包含包含确切细节的提示/示例,或者可以提供诸如极好的答案之类的答案。

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

【问题讨论】:

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


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

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

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

    【讨论】:

    • 感谢您的全面回答。我要上班了。
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2018-09-14
    • 2016-07-12
    • 2018-02-20
    • 1970-01-01
    • 2020-05-10
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多