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:
- uncomment dispatch_async ou utilisez
// dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in
- set webView à option
var webView:WKWebView?
un peu de chance avec une solution pour cela? –