Javascript для запроса Obj-c .. возвращая значение обратно в Javascript - PullRequest
3 голосов
/ 22 июня 2011

Мое приложение имеет компонент UIWebView, который вызывает функции Obj-c, используя 'webView: shouldStartLoadWithRequest: navigationType:' Я анализирую запрос, затем вызываю требуемый код Obj-c.

Что я хотел бы сделать дальше, это вернуть значение обратно в Webview .. например статус, сообщение и т. д.

В настоящее время я пробовал несколько решений, но, похоже, ничего не работает. Я не публикую сейчас код, так как он достаточно прост.

Одна попытка, о которой стоит упомянуть, это использование 'stringByEvaluatingJavascriptFromString', который установит глобальные переменные на странице UIWebView. Затем я попытался запустить бесконечный цикл (с тайм-аутом), который бы следил за изменением глобальной переменной. Тогда Javascript будет знать, что ответ возвращен функцией Objective-c. Похоже, это не работает, поскольку «бесконечный цикл» не блокирует поток javascript.

Кто-нибудь сталкивался с этой проблемой раньше.

Похоже, есть функция 'windowScriptObject', которая может разрешить мне прямой доступ к объектам сценария UIWebViews. Жаль, что это не доступно в iOS, кто-нибудь знает обходные пути для этого. Глядя на это сейчас ..

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

Итак, я решил пойти по маршруту обратного вызова.

Я позвоню, чтобы выполнить код JS в Obj-C, затем ничего не сделаю в браузере. Следующий фрагмент кода будет выполнен в функции обратного вызова, которая вызывается из Objective-c, все, что его работа сделана.

0 голосов
/ 22 июня 2011

Статья об этом на OS X здесь .

webView:shouldStartLoadWithRequest:navigationType: называется до содержимое веб-представления загружается, поэтому не будетобъект сценария загружен еще.Объект сценария будет загружен, когда делегат получит сообщение webView:didClearWindowObject:forFrame:, и затем вы сможете начать использовать [scriptObject evaluateWebScript: @"alert('hello')"] для оценки javascript и установки глобальных переменных.Я думаю, что ваша проблема в том, что между загружаемым объектом сценария и вашим обратным вызовом существует условие гонки, и ожидание объекта сценария должно решить проблему.

...