Как мне связать исходный файл исключения uiwebview javascript с исходным файлом?
-
19-09-2019 - |
Вопрос
Краткий вопрос: Что относится к «SourceID» исключения и как я могу связать его с соответствующей строкой/файлом источника?
Более длинная история:
Я запускаю код JavaScript в приложении для iPhone через [UIWebView stringByEvaluatingJavaScriptFromString:]
. Анкет Чтобы помочь разработке, а затем проверить предоставленный пользователем код, я использую следующую функцию для безопасного запуска любого кода:
// 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;
}
Если все пойдет хорошо, [MyJS runJS:js]
работает нормально и возвращает строку JSON, содержащую результат оценки последнего оператора в коде JS.
Теперь, если во время оценки происходят плохие вещи, я получаю объект исключения. Например, в случае синтаксической ошибки в коде «JS» я получаю что -то вроде этого:
{"Сообщение": "Ошибка PARSE", "LINE": 1, "SourceID": 26121296}
Что уже довольно полезно для отслеживания проблем ...
Однако, когда я пробегаю несколько строк runJS:
, Я хотел бы иметь возможность определить, какая из них вызвала исключение (потому что ошибка времени выполнения может исходить из функции, которая была создана в предыдущей строке кода JavaScript). Это свойство «SourceId» выглядит интересно, но я не могу найти то, на что он указывает. Это выглядит как адрес указателя (аналогичное значение, как указатели на другие объекты), но он не соответствует ни одной из строк, которые я передал оценщику. Как сделать эту ссылку?
Для бонусных баллов: существует ли какая-либо документация о среде JavaScript-специфической для UIWebView, например, этот объект исключения? А Руководство по веб -контенту Safari это хорошо, но не вдается в такие детали.
Решение
Worst-case solution:
Inside each js string being evaluated, add some code that throws an exception, catches it, extracts the sourceId and somehow exposes it so that the runJS:
method can keep a record of which sourceId goes with which string.
(Hopefully someone will find a better way and help bury this ugly answer!)