2017-01-17 3 views
1

J'ai implémenté dans mon UIViewController un WKWebViewDelegate, car le site Web derrière ce WKWebView nécessite l'autorisation de caméra et doit s'ouvrir à l'intérieur de l'application, à cause des Apple Design Guidelines.EXC_BAD_ACCESS et/ou EXC_BREAKPOINT dans WKWebView - modifications possibles pour corriger ce swift

Dans mon environnement de test, tout fonctionne. J'utilise crashyltics pour analyser mes applications en environnement réel. 10-15% de mes utilisateurs (100% = 130 utilisateurs quotidiens) auront le problème suivant.

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 
.... 

Une autre erreur est

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 

Alors je lis beaucoup sur EXC_BAD_ACCESS et je comprends qu'un point de référence à un objet qui est nul.

COMMENT MON WKWebView Ressemble

Ceci est ma structure dans mon story-board:

J'ai besoin d'utiliser un ContainerView, parce que mon code fonctionne tout simplement avec la ligne self.view = self.webView Essayé de a pris juste une vue, mais le WKWebView ne s'initialise pas.

//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 
      } 
     } 
    } 
} 

Last but not least, je perçois que lorsque j'appelle le WKWebView (Ou le ViewController avec le ContainerView qui incluent le WKWebView) avec

viewController.presentViewController(vc, animated: true, completion: nil)

et rejeter avec

super.dismissViewControllerAnimated(flag, completion: completion)

la mémoire ne se libère pas. Donc, je pourrais (quand j'appelle le WKWebView plus de 100 fois) obtenir une fuite de mémoire. Dans l'environnement en direct, ce scénario est vraiment improbable.

Cependant .. le problème est que je ne peux pas reproduire cette erreur que mes utilisateurs obtiennent. Donc, la question à vous avant que je vais envoyer une prochaine version à App Store: Voyez-vous un pas aller dans mon code? Quelque chose qui pourrait jeter ces erreurs?

j'ai changé des parties de mon code pour que:

  1. uncomment dispatch_async ou utilisez // dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in
  2. set webView à option var webView:WKWebView?
+0

un peu de chance avec une solution pour cela? –

Répondre

1

Il était très confus. Ma procédure était: Utilisateur cliquez sur le bouton WKWebview. Je demande la permission de la caméra. L'utilisateur a donné ou n'a pas donné. Utilisateur revenir en arrière. L'arrêt de l'application.

Lorsque je ne demande pas l'autorisation de l'appareil photo, il n'y a plus d'interruptions. Plus je ne peux pas savoir.