2017-01-17 7 views
1

Я реализовал в своем 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: вы видите, что в мой код нет? Что-то, что могло бы бросить эти ошибки?

Я изменил части моего кода, что:

  1. раскомментируйте dispatch_async или использовать // dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in
  2. набор WebView к дополнительным var webView:WKWebView?
+0

любая удача с решением для этого? –

ответ

1

Это было очень запутанным. Моя процедура: Пользователь нажал кнопку «Кнопка» на WKWebview. Я прошу разрешения камеры. Пользователь дал или не дал. Пользователь вернется. Завершение работы приложения.

Когда я не прошу разрешения камеры, больше не было прерываний. Больше я не могу узнать.