【问题标题】:Replaced UIWebView with WKWebView, but still same error from Apple用 WKWebView 替换 UIWebView,但仍然来自 Apple 的相同错误
【发布时间】:2020-05-03 13:59:16
【问题描述】:

我已从我的应用程序中删除 UIWebView。但是当我在 iTunes 上上传 iOS 应用程序时,我仍然收到相同的消息“Re: ITMS-90809: 已弃用 API 使用 - Apple 将停止接受使用 UIWebView API 的应用程序提交”

我在项目中全局搜索了UIWebView,没有搜索结果。这仅仅意味着 UIWebView 被删除。 我也更新了 pod。

我已使用以下代码验证了应用存档中 UIWebView 的存在:

grep -r "UIWebView" .

回复是

./BCSymbolMaps/F4DBB519-4BC9-3C29-B017-4C0BD603D250.bcsymbolmap:l_OBJC_PROTOCOL_$_UIWebViewDelegate
./BCSymbolMaps/F4DBB519-4BC9-3C29-B017-4C0BD603D250.bcsymbolmap:l_OBJC_LABEL_PROTOCOL_$_UIWebViewDelegate
./BCSymbolMaps/F4DBB519-4BC9-3C29-B017-4C0BD603D250.bcsymbolmap:-[Crashlytics monitorErrorsForUIWebView:]
./BCSymbolMaps/F4DBB519-4BC9-3C29-B017-4C0BD603D250.bcsymbolmap:CLSWebViewIsUIWebViewAlreadyMonitored
./BCSymbolMaps/63FADF77-FD8F-31A1-9B4E-2799F044786E.bcsymbolmap:l_OBJC_PROTOCOL_$_UIWebViewDelegate
./BCSymbolMaps/63FADF77-FD8F-31A1-9B4E-2799F044786E.bcsymbolmap:l_OBJC_LABEL_PROTOCOL_$_UIWebViewDelegate
./BCSymbolMaps/63FADF77-FD8F-31A1-9B4E-2799F044786E.bcsymbolmap:-[Crashlytics monitorErrorsForUIWebView:]
./BCSymbolMaps/63FADF77-FD8F-31A1-9B4E-2799F044786E.bcsymbolmap:CLSWebViewIsUIWebViewAlreadyMonitored
Binary file ./dSYMs/Eureka.framework.dSYM/Contents/Resources/DWARF/Eureka matches

如何检查仍然导致 UIWebView 错误的代码?

【问题讨论】:

标签: uiwebview wkwebview deprecated deprecation-warning


【解决方案1】:

如何检查 UIWebView 是否已从项目中完全移除?

解决办法是:

  1. 打开终端。在终端中打开您的项目根文件夹。
  2. 运行命令:grep -r "UIWebView" 。
  3. 此命令将列出所有包含“UIWebView”的 pod。不更新这些 pod 或删除这些 pod 并再次执行第 2 步命令。重复直到所有“UIWebView”匹配都没有被删除。


以下是指导您将现有 UIWebView 更新为 WKWebView 的一些步骤。

将“WebKit”类导入控制器。

假设您正在使用一个名为“webViewMain”的 UIWebView。然后转到您的故事板,只需将 UIWebView 替换为 UIView。确保您向 UIView 添加了与添加到 UIWebView 相同的约束。将新 UIView 中的 @IBOutlet 绘制到 UIWebView 的现有 @IBOutlet。 此处需要将@IBOutlet 的类从UIWebView 更改为UIView,因为您已将UIWebView 替换为UIView。

旧代码:@IBOutlet weak var webViewMain: UIWebView! 新代码:@IBOutlet weak var webViewMain: UIView!

然后新建一个变量来创建一个新的WKWebView。 代码:var webView : WKWebView!

在 UIWebView 中加载 request/html 的位置添加以下代码:

// WKWebView
            // init and load request in webview.
            webView = WKWebView(frame: self.webViewMain.frame)
            webView.navigationDelegate = self            
            self.webView.load(request)
            self.webViewMain.addSubview(webView)
            webView.translatesAutoresizingMaskIntoConstraints = false
// Adding constraints from webView(WKWebView) to webViewMain (UIView)
            webView.leadingAnchor.constraint(equalTo: webViewMain.leadingAnchor, constant: 0).isActive = true
            webView.trailingAnchor.constraint(equalTo: webViewMain.trailingAnchor, constant: 0).isActive = true
            webView.topAnchor.constraint(equalTo: webViewMain.topAnchor, constant: 0).isActive = true
            webView.bottomAnchor.constraint(equalTo: webViewMain.bottomAnchor, constant: 0).isActive = true
            // WKWebView

到目前为止,您已经将 UIWebView 替换为 WKWebView 。 现在是委托方法。 UIWebView 有委托类: UIWebViewDelegate WKWebView 有委托类:WKNavigationDelegate

将 UIWebViewDelegate 替换为 WKNavigationDelegate。



现在来比较 UIWebView 与 WKWebView 的委托方法:

UIWebView: func webViewDidFinishLoad(_ webView: UIWebView) WKWebView:func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

UIWebView: func webViewDidStartLoad(_ webView: UIWebView) WKWebView:func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)

UIWebView: func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool 在这里,我们返回 true/false 以加载/取消导航。 WKWebView:func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 这里我们返回decisionHandler(.allow)/decisionHandler(.cancel)来加载/取消导航。

缩放方面适合 webView (WKWebView) 的内容。

var scriptContent = "var meta = document.createElement('meta');"
    scriptContent += "meta.name='viewport';"
    scriptContent += "meta.content='width=device-width';"
    scriptContent += "document.getElementsByTagName('head')[0].appendChild(meta);"
    webView.evaluateJavaScript(scriptContent, completionHandler: nil)

设置 webView 的高度:

webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
    self.webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: {     (height, error) in
     self.constraintWebViewProductDescriptionHeight.constant = height as! CGFloat
    })
}
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2015-06-21
    • 2013-03-12
    相关资源
    最近更新 更多