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 警报崩溃
收到错误“没有字段宽度限制的 scanf 可能会在某些版本的 libc 上因大量输入数据而崩溃”