Я реализовал в своем UIViewController WKWebViewDelegate, потому что веб-сайт за этим WKWebView нуждается в разрешении на камеру и должен открыть внутри приложения из-за Apple Design Guidelines.EXC_BAD_ACCESS и/или EXC_BREAKPOINT в WKWebView - возможные изменения для исправления этого swift
В моей тестовой среде все работает. Я использую crashyltics для анализа моих приложений в живой среде. 10-15% моих пользователей (100% = 130 ежедневных пользователей) получат следующую проблему.
Crashed: com.apple.main-thread
0 CoreFoundation 0x182691968 CFRunLoopAddTimer + 88
1 JavaScriptCore 0x186f6cf98 WTF::RunLoop::TimerBase::start(double, bool) + 188
2 **WebKit** 0x18bb8362c IPC::ConnectionTerminationWatchdog::ConnectionTerminationWatchdog(WTF::OSObjectPtr<NSObject<OS_xpc_object>*>&, double) + 164
3 **WebKit** 0x18bb826d0 IPC::ConnectionTerminationWatchdog::createConnectionTerminationWatchdog(WTF::OSObjectPtr<NSObject<OS_xpc_object>*>&, double) + 48
4 WebKit 0x18bb7c488 WebKit::ChildProcessProxy::shutDownProcess() + 76
5 WebKit 0x18bd35cd0 WebKit::WebProcessProxy::shutDown() + 36
6 WebKit 0x18bd36244 WebKit::WebProcessProxy::removeWebPage(unsigned long long) + 432
7 WebKit 0x18bcd0934 WebKit::WebPageProxy::close() + 536
8 WebKit 0x18bdc3200 -[WKWebView dealloc] + 112
9 libobjc.A.dylib 0x1811f5fe0 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 704
10 UIKit 0x188658668 -[UIView dealloc] + 1644
11 libobjc.A.dylib 0x1811f5fe0 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 704
12 UIKit 0x188658668 -[UIView dealloc] + 1644
....
Другая ошибка
Crashed: com.apple.main-thread
0 libdispatch.dylib 0x190daaf20 _dispatch_barrier_sync_f_slow + 596
1 WebKit 0x19b37701c __64-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]_block_invoke + 240
2 WebKit 0x19b37701c __64-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]_block_invoke + 240
Так что я много читал о EXC_BAD_ACCESS, и я понимаю, что ссылка указывает на объект, который равен нулю.
КАК МОЯ WKWebView Похожа
Это моя структура в моей раскадровке:
мне нужно использовать ContainerView, потому что мой код просто работать с линией self.view = self.webView
Пробовали взял только представление, но затем WKWebView не инициализируется.
//WKWebView in Container
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView()
self.webView.navigationDelegate = self
self.view = self.webView
dispatch_async(dispatch_get_main_queue()) {
if self.url.characters.count > 0 {
if let url = NSURL(string: self.url) {
self.webView.loadRequest(NSURLRequest(URL: url))
self.webView.allowsBackForwardNavigationGestures = true
}
}
}
}
И последнее, но не в последнюю очередь я обнаруживаю, что, когда я называю WKWebView (или ViewController с ContainerView, которые включают WKWebView) с
viewController.presentViewController(vc, animated: true, completion: nil)
и увольняет с
super.dismissViewControllerAnimated(flag, completion: completion)
память не освобождается. Поэтому я мог (когда я вызываю WKWebView более 100 раз) получить утечку памяти. В живой среде этот сценарий действительно невероятен.
Однако проблема в том, что я не могу воспроизвести эту ошибку, которую получают мои пользователи. Итак, вопрос вам, прежде чем я отправлю следующую версию в App Store: вы видите, что в мой код нет? Что-то, что могло бы бросить эти ошибки?
Я изменил части моего кода, что:
- раскомментируйте dispatch_async или использовать
// dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in
- набор WebView к дополнительным
var webView:WKWebView?
любая удача с решением для этого? –