WKWebView évaluer JavaScript valeur de retour
J'ai besoin de changer une fonction d'évaluer le JavaScript de UIWebView à WKWebView. J'ai besoin de retourner le résultat de l'évaluation de cette fonction.
Maintenant, je vais appeler:
[wkWebView evaluateJavaScript:call completionHandler:^(NSString *result, NSError *error)
{
NSLog(@"Error %@",error);
NSLog(@"Result %@",result);
}];
Mais j'ai besoin d'obtenir de résultat comme valeur de retour, comme dans UIWebView
.
Pouvez-vous suggérer une solution?
NSString *returnVal = [self.webView stringByEvaluatingJavaScriptFromString:@"func(\"arg\")"];
ne fait pas ce travail?- N cette fonction est en UIWebView et de travail, j'ai besoin de changer pour WKWebView. Je peux résoudre ce problème avec certains de rappel, mais c'est trop compliqué pour mon projet.
- hm... étrange, ce n'est la sortie de la console ? après NSLogs
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Ce n'est pas de travail sur iOS 12+ plus.
J'ai résolu ce problème en attente de résultat jusqu'à ce que la valeur du résultat est retourné.
J'ai utilisé NSRunLoop pour l'attente, mais je suis pas sûr que c'est le meilleur moyen ou pas...
Ici est la catégorie code source de l'extension que j'utilise maintenant:
Exemple de code:
while
de boucle (comme dans cette solution), le gestionnaire de rappel sera jamais appelé.evaluateJavaScript
attend thread principal libéré, mais cela n'arrive jamais car il enfermé dans la boucle..distantFuture
- si le runloop n'a pas de sortie, puis la boucle ne s'arrêtera jamais. Une meilleure alternative est.distantPast
ouDate(timeIntervalSinceNow: 0.1)
Cette solution fonctionne également si le javascript du code de soulever NSError:
Je viens de tombé sur le même problème et a écrit un peu rapide (3.0) WKWebView extension pour elle, pensé que je pourrais partager:
J'ai trouvé que la valeur de la déclaration finale dans votre injecté javascript est le retour de la valeur passée comme argument id à la fin de la fonction, si il n'y a pas d'exceptions. Ainsi, par exemple: