Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send events from HTML running inside a UIWebView to native Objective-C code?

I want to integrate a full HTML framework (ie HTML/CSS/JavaScript) inside an iOS app and make the UIWebView in charge of running the HTML content being able to communicate with the rest of the native Objective-C source code.

Direction 1: from Objective-C to HTML inside a UIWebView

The way to make the rest of the source send messages to the HTML content is pretty straightforward: i can just call stringByEvaluatingJavaScriptFromString: on the Objective-C side and implement JavaScript methods the right way.

Direction 2: from HTML inside a UIWebView to Objective-C

This is the way I can't really figure out. My only idea so far is to make my app a local web server and make the HTML request stuff to it. But I have no idea how to do that although I suppose it can be bone as I believe apps such as Things, VLC or 1Password might use this kind of features.

Any idea to make this direction 2 work or any new perspective to make events inside HTML content being sent to Objective-C code is welcome.

like image 408
Dirty Henry Avatar asked Mar 27 '12 10:03

Dirty Henry


1 Answers

I have done this using jQuery and UIWebViewDelegate:

JavaScript (jQuery mobile):

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

So, the resulting URL looks like: donordialog:bloodTypeChanged(typeAB-)

In my objc code:

-(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;
}

This code was copied verbatim from a project I am currently working on, and can verify that this works.

like image 138
Richard J. Ross III Avatar answered Oct 16 '22 11:10

Richard J. Ross III