线程 1:访问外部时从 Web 视图发出 SIGABRT 信号 link
Thread 1: signal SIGABRT from web view when accessing external link
我目前正在尝试通过 WebView 在移动设备(iPhone 和 iPad)上部署响应式网站。
以下是有关该应用程序的一些详细信息:
- 应用程序的唯一目的是显示包含网站的 webView
- 使用 WKWebView 组件,因为 UIWebView 在我的环境中已弃用
- 任何外部 links 都应该在 webView
中加载一个新页面
- 目前使用 Swift 3 和 Xcode 9.2
- 在 WebKit WebView 和 ViewController
之间创建了一个 Outlet
- 编辑了 info.plist;应用程序传输安全设置 > 将 NSAllowArbitraryLoads 设置为 true
源代码:
ViewController.swift
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
// edit the url the app should load here
private var domain = "https://example.com/"
@IBOutlet weak var webView: WKWebView!
override func loadView() {
//delegates the navigation of other urls while still inside the webview
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
webView.allowsLinkPreview = false
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
// calls the website in a 'iframe' style
let url = URL(string: domain)
let request = URLRequest(url: url!)
webView.load(request)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping ((WKNavigationActionPolicy) -> Void)) {
// outputs are for debugging purpose
print("webView :\(webView)" + "\n")
print("decidePolicyForNavigationAction :\(navigationAction)" + "\n")
print("decisionHandler :\(decisionHandler)" + "\n")
switch navigationAction.navigationType {
case .linkActivated:
print("request : " + navigationAction.request.url!.absoluteString)
self.webView?.load(navigationAction.request)
return
default:
break
}
if let url = navigationAction.request.url {
print("url : " + url.absoluteString)
}
decisionHandler(.allow)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
AppDelegate.swift :
import UIKit
import WebKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
}
我在尝试打开外部和内部 links 时遇到了麻烦;该应用程序将抛出信号 SIGABRT。
据我了解,此错误通常发生在 Outlet 不匹配时,但我的项目只有一个 Outlet (WebView / ViewController)。我试过删除它并重新创建它无济于事。
如果问题是在从外部 link 加载的页面和我的应用程序之间没有创建 Outlet,我不知道如何解决这个问题,因为我无法控制网站。
注意:当我将 webView.allowsLinkPreview 设置为 true(在 func loadView() 中)时,应用程序会加载新页面但会花费大量时间。当发生这种情况时,函数 webView 也不会被第二次调用。
任何帮助将不胜感激。
谢谢。
编辑。根据评论中的要求,这是调试器抛出的内容:
libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
此外,Thread 1 SIGABRT 信号似乎在 AppDelegate class。
有趣的错误信息应该是
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[myAppName webView:decidePolicyForNavigationAction:decisionHandler:] was not called'
在 webView(_ webView:, decidePolicyFor navigationAction:, decisionHandler:)
中,在一种特定情况下你不这样做 decisionHandler(someValue)
,这就是它崩溃的原因。
所以在
case .linkActivated:
print("request : " + navigationAction.request.url!.absoluteString)
self.webView?.load(navigationAction.request)
return
您需要在执行 return 之前执行 decisionHandler(someValue)
。
我目前正在尝试通过 WebView 在移动设备(iPhone 和 iPad)上部署响应式网站。
以下是有关该应用程序的一些详细信息:
- 应用程序的唯一目的是显示包含网站的 webView
- 使用 WKWebView 组件,因为 UIWebView 在我的环境中已弃用
- 任何外部 links 都应该在 webView 中加载一个新页面
- 目前使用 Swift 3 和 Xcode 9.2
- 在 WebKit WebView 和 ViewController 之间创建了一个 Outlet
- 编辑了 info.plist;应用程序传输安全设置 > 将 NSAllowArbitraryLoads 设置为 true
源代码:
ViewController.swift
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
// edit the url the app should load here
private var domain = "https://example.com/"
@IBOutlet weak var webView: WKWebView!
override func loadView() {
//delegates the navigation of other urls while still inside the webview
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
webView.allowsLinkPreview = false
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
// calls the website in a 'iframe' style
let url = URL(string: domain)
let request = URLRequest(url: url!)
webView.load(request)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping ((WKNavigationActionPolicy) -> Void)) {
// outputs are for debugging purpose
print("webView :\(webView)" + "\n")
print("decidePolicyForNavigationAction :\(navigationAction)" + "\n")
print("decisionHandler :\(decisionHandler)" + "\n")
switch navigationAction.navigationType {
case .linkActivated:
print("request : " + navigationAction.request.url!.absoluteString)
self.webView?.load(navigationAction.request)
return
default:
break
}
if let url = navigationAction.request.url {
print("url : " + url.absoluteString)
}
decisionHandler(.allow)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
AppDelegate.swift :
import UIKit
import WebKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
}
我在尝试打开外部和内部 links 时遇到了麻烦;该应用程序将抛出信号 SIGABRT。
据我了解,此错误通常发生在 Outlet 不匹配时,但我的项目只有一个 Outlet (WebView / ViewController)。我试过删除它并重新创建它无济于事。
如果问题是在从外部 link 加载的页面和我的应用程序之间没有创建 Outlet,我不知道如何解决这个问题,因为我无法控制网站。
注意:当我将 webView.allowsLinkPreview 设置为 true(在 func loadView() 中)时,应用程序会加载新页面但会花费大量时间。当发生这种情况时,函数 webView 也不会被第二次调用。
任何帮助将不胜感激。 谢谢。
编辑。根据评论中的要求,这是调试器抛出的内容:
libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
此外,Thread 1 SIGABRT 信号似乎在 AppDelegate class。
有趣的错误信息应该是
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[myAppName webView:decidePolicyForNavigationAction:decisionHandler:] was not called'
在 webView(_ webView:, decidePolicyFor navigationAction:, decisionHandler:)
中,在一种特定情况下你不这样做 decisionHandler(someValue)
,这就是它崩溃的原因。
所以在
case .linkActivated:
print("request : " + navigationAction.request.url!.absoluteString)
self.webView?.load(navigationAction.request)
return
您需要在执行 return 之前执行 decisionHandler(someValue)
。