WKWebView 因某些查询而崩溃(iOS Swift)

Posted

技术标签:

【中文标题】WKWebView 因某些查询而崩溃(iOS Swift)【英文标题】:WKWebView crashing with certain queries (iOS Swift) 【发布时间】:2021-05-10 11:45:50 【问题描述】:

我正在为婴儿名字开发一个类似火种的滑动应用程序。我创建了一个方法,当您单击您最喜欢的名称之一旁边的按钮时,它会弹出一个窗口(带有 WKWebView 的 UIViewController),其中显示具有此特定名称含义的 google 搜索。

问题在于,对于某些名称,应用程序会崩溃,因为 URL 返回 nil。我不明白发生了什么,因为其他名称工作得很好。我发现像“OddVeig”和“OddLaug”这样的斯堪的纳维亚名字会发生这种情况。

下面是我的 UIViewController 类,它与搜索结果一起弹出(我已将所有初始化代码放在 layoutSubViews() 中,因为我在 ios 12 中遇到了一些问题,如果我放 WKWebView 将无法正确调整大小它在 viewDidLoad() 中):

import UIKit
import WebKit

class WebViewController: UIViewController, WKNavigationDelegate 

    @IBOutlet weak var webContainer: UIView!
    var webView : WKWebView!
    var query : String?
    
    override func viewDidLoad() 
        super.viewDidLoad()
    
    
    override func viewDidLayoutSubviews() 
        webView = WKWebView()
        webView.navigationDelegate = self
        webContainer.addSubview(webView)
        self.view.alpha = 0.9
        
        webView.frame = self.view.frame
        webView.layer.position.y += 20
        let slideDownImage = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 30))
        slideDownImage.setImage(UIImage(named: "slideIconWhite"), for: .normal)
        slideDownImage.imageView?.contentMode = .scaleAspectFit

        if let n = query 
            let url = URL(string: "https://www.google.com/search?q=\(n)")! // Causing error: Found nil
            webView.load(URLRequest(url: url))
            webView.allowsBackForwardNavigationGestures = true
        
        webContainer.addSubview(slideDownImage)
        slideDownImage.frame = CGRect(x: 0, y: 0, width: self.webView.frame.size.width, height: 20)
        slideDownImage.backgroundColor = .gray
        slideDownImage.alpha = 0.7
        slideDownImage.addTarget(self, action: #selector(slideDown), for: .touchUpInside)
    
    
    @objc func slideDown() 
        self.dismiss(animated: true, completion: nil)
    



我在 FavoritesViewController 类中使用 segue,如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "favoritesToWeb" 
        let destination = segue.destination as! WebViewController
        destination.query = "\(searchName)+\(NSLocalizedString("meaning", comment: "meaning"))"
    

希望有人能告诉我我做错了什么。 提前致谢。

帕特里克

【问题讨论】:

您不能在 viewDidLayoutSubviews 方法中添加这样的代码。只需在 viewDidLayoutSubviews 方法中管理和设置框架,否则将其他代码添加到 viewDidLoad。 导致应用程序崩溃的实际 URL 是什么?你为什么要强制解开 url? 以下是错误的。 destination.query = "(searchName)+(NSLocalizedString("meaning", comment: "meaning"))" destination.query = searchName + "+" + NSLocalizedString("meaning", comment: "meaning") @RajaKishan 谢谢。我在我的代码中对其进行了编辑,因此 didLayoutSubviews 仅包含对框架的更改。 【参考方案1】:

query 变量需要进行百分比编码,我想当您在查询字符串中有空白字符时这一定会崩溃。使用addingPercentEncoding 为查询字符串添加百分比编码。

API 参考: https://developer.apple.com/documentation/foundation/nsstring/1411946-addingpercentencoding

相关问题: Swift. URL returning nil

【讨论】:

天哪,谢谢 :) 我正在读取 .txt 文件中的所有名称,显然有些名称末尾有空格,我看不到。完美解决这个问题!

以上是关于WKWebView 因某些查询而崩溃(iOS Swift)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13 SceneDelegate 上的 WKWebView 警报崩溃

iOS 10.3 WKWebView 访问照片库时崩溃

收到错误“没有字段宽度限制的 scanf 可能会在某些版本的 libc 上因大量输入数据而崩溃”

iOS 测试因 waitForExpectationsWithTimeout 而崩溃

与 WKWebView 相关的 iOS 7 崩溃

iOS:浏览器因内存不足而崩溃