Como faço para relacionar um UIWebView JavaScript Exception's SourceId com um arquivo de origem?
-
19-09-2019 - |
Pergunta
Pergunta curta: a que se refere a "fonte" de uma exceção e como posso vinculá -lo à string/arquivo de origem relevante?
História mais longa:
Estou executando o código JavaScript em um aplicativo nativo do iPhone através [UIWebView stringByEvaluatingJavaScriptFromString:]
. Para ajudar o desenvolvimento e posteriormente verificar o código fornecido pelo usuário, uso a seguinte função para executar com segurança qualquer código:
// 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;
}
Se tudo correr bem, [MyJS runJS:js]
Executa bom e retorna uma string json que contém o resultado da avaliação da última instrução no código 'JS'.
Agora, se as coisas ruins acontecerem durante a avaliação, recebo um objeto de exceção jsonificado. Por exemplo, no caso de um erro de sintaxe no código 'JS', eu recebo algo assim:
{"Mensagem": "Erro de análise", "Linha": 1, "SourceID": 26121296}
O que já é bastante útil para rastrear problemas ...
No entanto, enquanto eu corro várias cordas através runJS:
, Eu gostaria de poder identificar qual deles causou a exceção (porque um erro de tempo de execução poderia vir de uma função criada em uma string de código JavaScript anterior). Esta propriedade "SourceID" parece interessante, mas não consigo encontrar o que aponta. Parece um endereço de ponteiro (valor semelhante aos ponteiros a outros objetos), mas não corresponde a nenhuma das cordas que passei para o avaliador. Como posso fazer este link?
Para pontos de bônus: existe alguma documentação disponível sobre o ambiente JavaScript específico da UIWebView, como este objeto de exceção? o Guia de conteúdo da Web Safari é bom, mas não entra nesse tipo de detalhes.
Solução
Solução de pior caso:
Dentro de cada string js sendo avaliada, adicione algum código que joga uma exceção, pega -o, extrai o fonte e de alguma forma o expõe para que o runJS:
O método pode manter um registro do qual o SourceID acompanha qual string.
(Espero que alguém encontre uma maneira melhor e ajude a enterrar essa resposta feia!)