Предложения о том, как взаимодействовать из JS, запущенного в UIWebView, с размещенным приложением obj-c?

#javascript #iphone #objective-c #uiwebview

#javascript #iPhone #objective-c #uiwebview

Вопрос:

Я планирую создать оболочку приложения для iphone с uiwebview, при этом основная часть моего приложения будет выполняться через javascript в uiwebview.

Теперь я знаю, что легко обмениваться данными из среды obj-c в среду javascript с помощью stringByEvaluatingJavaScriptFromString, однако есть ли хороший рекомендуемый способ обмена данными из среды javascript в мир obj-c?

Спасибо

Ответ №1:

Я всегда использую подход, при котором приложение «переходит» к специальному URL:

 window.location = "myapp://somemessage/someargument";
  

И где приложение улавливает это в следующей функции:

 -(BOOL)webView:(UIWebView *)webView
                shouldStartLoadWithRequest:(NSURLRequest *)request
                navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];
    if ( [[url scheme] isEqualToString:@"myapp"] )
    {
        [self handleJSEvent:url];
        return NO;
    }
    return YES;
}
  

Кроме того, в зависимости от того, что вам нужно, вы могли бы использовать некоторую очередь событий, которую вы извлекаете с помощью JSON.stringify(events) , в ответ на сообщение, отправленное приложению с использованием метода, описанного выше. Для обмена данными из приложения в js также очень подходит JSON.

Если есть стандартный способ сделать это, я явно его пропустил.

Комментарии:

1. Из моего поиска в Google, я думаю, вы описали общий «стандарт», если хотите. Отлично!

2. Всегда пожалуйста. Помимо того, что подсказывало мне мое внутреннее чутье, этот подход также довольно надежен.

3. Большое спасибо. Приятно знать, что это тоже надежно, это важно.

Ответ №2:

Существует очень хороший метод для вызова javascript внутри UIWebView:

 [webView stringByEvaluatingJavaScriptFromString:@"yourJSFunction('some_data');"];
  

Обратные вызовы лучше всего выполнять, как указано в MVDS, через URL:

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
  

Ответ №3:

Я только что создал библиотеку, которая облегчит вам это взаимодействие, в основном используя метод, описанный mvds и Ondrej. Включает двустороннюю связь в стиле событий jQuery с дополнительными полезными нагрузками JSON с несколькими прослушивателями. Проверьте это: https://github.com/tcoulter/jockeyjs

Ответ №4:

Возможно, путем изменения хэша URL?

Комментарии:

1. Вы имеете в виду blah.com/something.html#HASH ? Я заметил этот подход, включает ли это перехват события shouldStartLoadWithRequest?