WKWebview Javascript работает на симуляторе, но не работает на устройстве, если представление не на экране
Я использую WKWebview для запуска сценариев JavaScript.
Я не использую JSContext et.al, так как мне нужен контекст javascript, чтобы иметь возможность выполнять запросы XHTTP, которые невозможны только с помощью JSContext.
Это представление не добавляется в иерархию представлений, и мне это не интересно.
WKWebview используется только для его способности запускать код JS в своем движке.
Код JavaScript работает точно так, как и ожидалось на симуляторе.
Точно такой же код будет также работать в контексте некоторых других приложений, с которыми я тестировал.
Но по некоторым причинам в некоторых приложениях WKWebview не будет выполнять JavaScript, если WKWebview не будет добавлен в иерархию представлений. Следующий код будет работать как положено. При удалении кода #warning перестает работать как положено
-(void)connect {
//TODO: Handle multiple connect calls
WKUserContentController *userContentController = [WKUserContentController new];
[self addScriptMessageHandlersForSocketEvents:userContentController];
NSString *socketFileContent = [self.class socketIOScript];
WKUserScript *socketIOScript = [[WKUserScript alloc] initWithSource:socketFileContent
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:NO];
[userContentController addUserScript:socketIOScript];
NSString *bridgeJs = [self.class bridgeScript];
WKUserScript *bridgeScript = [[WKUserScript alloc] initWithSource:bridgeJs
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:NO];
[userContentController addUserScript:bridgeScript];
NSMutableDictionary *d = [NSMutableDictionary new];
for (NSURLQueryItem *item in _parameters) {
d[item.name] = item.value;
}
NSString *params = json(d);
NSString *socketURLScript = [NSString stringWithFormat:@"createSocket(%@,%@);log('created script')",stringify(_url),params];
WKUserScript *createSocket = [[WKUserScript alloc] initWithSource:socketURLScript
injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
forMainFrameOnly:NO];
[userContentController addUserScript:createSocket];
WKWebViewConfiguration * wkconfiguration = [WKWebViewConfiguration new];
wkconfiguration.userContentController = userContentController;
_wv = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) configuration:wkconfiguration];
#warning REMOVE THIS AND THE WKWebview stops working on some devices (NOT ALL DEVICES) and works in some applications as expected
[[UIApplication sharedApplication].keyWindow addSubview:_wv];
// END REMOVE THIS
_wv.navigationDelegate = self;
dispatch_group_enter(_loadedSemaphore);
[_wv loadHTMLString:@"<h1></h1>" baseURL:nil];
}