Я использую 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];
}
Методы делегата являются необязательными. Я реализовал only- (void) webView: (WKWebView *) webView didFinishNavigation: (null_unspecified WKNavigation *) навигация –