Как отправлять события из HTML, работающего внутри UIWebView, в собственный код Objective-C? - PullRequest
9 голосов
/ 27 марта 2012

Я хочу интегрировать полный HTML-фреймворк (например, HTML / CSS / JavaScript) в приложение для iOS и сделать так, чтобы UIWebView отвечал за запуск HTML-контента и мог взаимодействовать с остальным исходным исходным кодом Objective-C.

Направление 1: из Objective-C в HTML внутри UIWebView

Способ заставить остальную часть источника отправлять сообщения в контент HTML довольно прост: iможно просто вызвать stringByEvaluatingJavaScriptFromString: на стороне Objective-C и правильно реализовать методы JavaScript.

Направление 2: от HTML внутри UIWebView до Objective-C

Так я не могу понять.Моя единственная идея пока состоит в том, чтобы сделать мое приложение локальным веб-сервером и сделать HTML-запрос к нему.Но я понятия не имею, как это сделать, хотя я полагаю, что это может быть костью, поскольку я считаю, что такие приложения, как Things, VLC или 1Password, могут использовать такие функции.

Любая идея сделать это направление 2 работа или любая новая перспектива создания событий внутри HTML-контента, отправляемого в код Objective-C, приветствуется.

Ответы [ 4 ]

19 голосов
/ 27 марта 2012

Я сделал это, используя jQuery и UIWebViewDelegate:

JavaScript (jQuery mobile):

$("#bloodType").change(function() {
    url = $("#bloodType option:selected").text();
    url = "donordialog:bloodTypeChanged(" + url + ")";
    window.location = url;
});

Итак, полученный URL выглядит так: donordialog:bloodTypeChanged(typeAB-)

В моем коде объекта:

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *URL = [request URL];
    if ([[URL scheme] isEqualToString:@"donordialog"])
    {
        // now we need to figure out the function part
        NSString *functionString = [URL resourceSpecifier];

        if ([functionString hasPrefix:@"bloodTypeChanged"])
        {
            // the blood type has changed, now do something about it.
            NSString *parameter = [functionString stringByReplacingOccurrencesOfString:@"bloodTypeChanged" withString:@""];

            // remove the '(' and then the ')'
            parameter = [parameter stringByReplacingOccurrencesOfString:@"(" withString:@""];
            parameter = [parameter stringByReplacingOccurrencesOfString:@")" withString:@""];

            // log the paramter, as I don't know what to do with it right now
            NSLog(@"%@", parameter);
        }

        return NO;
    }

    return YES;
}

Этот код был дословно скопирован из проекта, над которым я сейчас работаю, и может убедиться, что это работает.

5 голосов
/ 05 марта 2013

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

3 голосов
/ 27 марта 2012

Обычно вы общаетесь с JavaScript, открывая вымышленный URL (window.location), а затем внедряя UIWebViewDelegate -webView:shouldStartLoadWithRequest:navigationType:, чтобы игнорировать навигацию и обрабатывать то, что нужно сделать вместо этого.

(В Mac OS X WebKit вы можете предоставлять объекты Objective-C, которые имеют функции JavaScript, для веб-сайта, но это не доступно в iOS.)

0 голосов
/ 22 октября 2013

PhoneGap был построен именно для этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...