Comment puis-je raconterai un UIWebView javascript sourceid de exception à un fichier source?
-
19-09-2019 - |
Question
petite question: Qu'est-ce, et comment puis-je « sourceid » est une exception renvoie un lien à la chaîne / fichier source pertinente
Longer histoire:
Je suis en cours d'exécution du code Javascript dans une application native iPhone via [UIWebView stringByEvaluatingJavaScriptFromString:]
. Pour aider le développement, et vérifier plus tard le code fourni par l'utilisateur, utiliser la fonction suivante pour exécuter en toute sécurité tout code:
// Inside @implementation MyJS
- (NSString *)runJS:(NSString *)js {
// Do some escaping on 'js' to make it look like a string literal.
js = escape(js);
NSString *result =
[webView stringByEvaluatingJavaScriptFromString:
[NSString stringWithFormat:@"try { JSON.stringify(eval(\"%@\")); } except (e) { JSON.stringify(e); }", js]
];
return result;
}
Si tout va bien, [MyJS runJS:js]
fonctionne très bien et retourne une chaîne JSON contenant le résultat de l'évaluation de la dernière instruction dans le code « js ».
Maintenant, si mauvaises choses se produisent au cours de l'évaluation, je reçois un objet d'exception JSONified. Par exemple, dans le cas d'une erreur de syntaxe dans le code « js », je reçois quelque chose comme ceci:
{ "message": "Erreur d'analyse", "ligne": 1, "sourceid": 26121296}
Ce qui est déjà très utile pour suivre les problèmes ...
Cependant, comme je lance plusieurs chaînes par runJS:
, je voudrais être en mesure d'identifier lequel a provoqué l'exception (car une erreur d'exécution pourrait provenir d'une fonction qui a été créé dans une chaîne précédente code javascript). Cette propriété « sourceid » semble intéressant, mais je ne peux pas trouver ce qu'il pointe. Il ressemble à une adresse de pointeur (valeur similaire en tant que pointeurs vers d'autres objets), mais il ne correspond pas à l'une des chaînes que je l'ai passé à l'évaluateur. Comment puis-je faire ce lien?
Pour les points bonus: Y at-il de la documentation sur l'environnement javascript spécifique à UIWebView, comme cet objet d'exception?
La solution solution pire cas: Dans chaque js chaîne en cours d'évaluation, ajouter un code qui lance une exception, il attrape, extrait le sourceid et expose en quelque sorte pour que la méthode (Espérons que quelqu'un trouvera une meilleure façon et aider à enterrer cette réponse laid!) runJS:
peut tenir un registre dont sourceid va avec quelle chaîne.