WkWebKit - javascript sur la page chargée trouve fenêtre.webkit est pas défini
Je suis en train d'expérimenter avec WkWebKit de parler de retour et vient entre l'application et la page. Je peux obtenir de javaScript pour exécuter amende à l'aide WkWebView evaluateJavascript méthode, mais lorsque j'essaie d'exécuter la fenêtre.webkit.messageHandlers.myHandler.postMessage('hello world!') sur le JavaScript de la page, je trouve que la fenêtre.webkit n'est pas défini.
Bizarre... je suis en cours d'exécution dans un simulateur de l'iPad avec ios 8.4. Je pensais que c'était disponible dans la version originale 8, non?
Je ne peux pas trouver quelqu'un d'autre poster sur ce, peut-être que j'ai fait quelque chose de mal?
J'ai même joint mon Safari Développeur sur le simulateur du navigateur, et dans la console j'essaie de voir ce que la fenêtre.webkit est, et bien sûr, il n'existe pas.
Remarque que j'ajoute un premier script à exécuter lorsque le chargement de la page (je vois cela dans l'éditeur de javascript - le message est enregistré). Et j'ajoute un script gestionnaire de message...
[EDIT: Ajout de code plus de détails ici]
Voici mon code:
- (void)viewDidLoad {
[super viewDidLoad];
//Do any additional setup after loading the view, typically from a nib.
NSLog(@"main view Controller viewDidLoad called...");
//if we are running on an OLD ios (pre v8) WKWebView will not exist. So don't create it if it doesn't exist...
if (NSClassFromString(@"WKWebView")) {
//WKWebView cannot be dragged onto storyboard, so have to create it manually here.
//We have a "ContainerView" called _webContainer that this browser view will live inside
//First we create a web view configuration object...
WKWebViewConfiguration *wbConfig = [WKWebViewConfiguration alloc];
wbConfig.mediaPlaybackAllowsAirPlay = true;
wbConfig.mediaPlaybackRequiresUserAction = false;
//inject some Javascript into our page before it even loads...
NSString *scriptSource = @"console.log('Hi from the iOS app hosting this page...'); window.hostedByWkWebView=true;";
WKUserScript *userScript = [[WKUserScript alloc]
initWithSource:scriptSource
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:YES];
[wbConfig.userContentController addUserScript:userScript];
[wbConfig.userContentController addScriptMessageHandler:self name:@"myHandler"]; //javascript to use this would be: window.webkit.messageHandlers.myHandler.postMessage
//Ok, the config is created, now create the WkWebView instance, passing in this config...
_webView = [[WKWebView alloc] initWithFrame: [_webContainer bounds] configuration:wbConfig];
_webView.autoresizesSubviews = true;
_webView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
_webView.navigationDelegate = self;
//Add the web view to the container view, and tell the container to automatically resize its subviews, height and width.
[_webContainer addSubview:_webView];
_webContainer.autoresizesSubviews = true;
_webContainer.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
//Set the URL for the webview and navigate there...
NSString *fullURL = @"https://myurlgoeshere.com";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[_webView loadRequest:requestObj];
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Cannot create Web View" message:@"The web view used requires iOS 8 or higher. Sorry." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"", nil];
[alert show];
}
//...
OriginalL'auteur Brian B | 2015-09-24
Vous devez vous connecter pour publier un commentaire.
La fenêtre.webkit espace de noms n'apparaît que dans webview avec un script de gestion de message.
Assurez-vous que vous avez appelé addScriptMessageHandler méthode de WKUserContentController.
Hmmm. Alors que mon principal ViewController (dont le code est ci-dessus) ne poignée de la userContentController:didReceiveScriptMessage message, il n'est pas réellement un WKScriptMessageHandler objet. Donc, je reçois un avertissement du compilateur, mais j'étais sous l'impression qu'il allait travailler toujours de toute façon...
Ok, je ne suis pas sûr pourquoi cela fonctionne maintenant, je n'ai pas beaucoup de changement! Peut-être que j'étais trop en retard au travail. De toute façon, j'ai changé le sous-classe de la ViewController à un WKScriptMessageHandler et il a bien fonctionné. Eh bien, j'ai aussi essayé avec l'iPhone 5 en iOS 8.4. Mais puis-je mettre le VewController retour à la façon dont il a été, essayé sur iPad iOS 8.4 simulateur, et, eh bien, il a bien fonctionné de nouveau. J'ai remarqué que dans le Safari de débogage du javascript dans la console, j'ai pu faire l'appel à webkit.messageHandlers... mais ça n'a pas webkit est défini. Bizarre, mais ça fonctionne.
Vous oubliez appel de méthode init de WKWebViewConfiguration.
Donc j'ai fait... je suis nouveau sur Objective-C, donc je n'ai pas remarqué moi-même.
OriginalL'auteur soflare
Je l'ai résolu et le problème est que si vous définissez
userContentController
à un nouvel objet, quiuserContentController
'sWKScriptMessageHandler
s ne seront pas enregistrés correctement dans Apple code interne:fixe à l'aide de la déjà instancié
userContentController
par Apple:C'est la bonne réponse et a résolu mon problème. Aucune idée pourquoi, nous devons utiliser l'existant et de ne pas en créer un nouveau? Quand nous en créer un nouveau et de le définir, par exemple, d'auto.wkWebView.la configuration.userContentController = userContentController; - le nouveau ignoré? La propriété n'est pas en lecture seule.
C'est l'un!
Wow j'ai trouvé cette réponse après une heure de lutte avec le code. Mais POURQUOI?? Si il y a un setter disponible pourquoi ne devrions-nous pas être en mesure d'utiliser un programme personnalisé? C'est un peu une mauvaise conception d'API sur WKWebView.
OriginalL'auteur Pascal Kaufmann
J'ai couru dans cette SORTE parce que j'étais rencontrent le même problème et c'est comment je l'ai résolu en utilisant une mesure
CustomContentController
(sous-classe deWKUserContentController
) de l'instance.Dans mon cas, le
CustomContentController
est une sous-classe deWKUserContentController
dans lequel leadd(_ scriptMessageHandler: WKScriptMessageHandler, name: String)
méthode est appelée, mais je ne crois pas que c'est important.Je crois que le
WKUserContentController
doit être établi et appliqué à unWKWebViewConfiguration
avant la WKWebView est initialisé viaWKWebView(frame: .zero, configuration: webViewConfiguration)
Si le WKWebView a été créé et puis vous essayez de modifier le
WKWebViewConfiguration
vous rencontrerezwindow.webkit
n'étant pas disponible dans le JSContext.OriginalL'auteur David Anderson
J'ai rencontré le même problème. Et après perdre 2 heures, j'ai trouvé ce ci-dessous pour fonctionner correctement. Mais je ne sais pas pourquoi.
OriginalL'auteur shaojunx