Как мне связать исходный файл исключения uiwebview javascript с исходным файлом?

StackOverflow https://stackoverflow.com/questions/2040033

Вопрос

Краткий вопрос: Что относится к «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!)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top