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

南笙酒味 提交于 2019-12-03 00:08:42

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.

I just created a library that will do this for you. It supports two-way communication between your web app and iOS about through JSON, relying heavily on this method. Check it out: https://github.com/tcoulter/jockeyjs

Jesper

The way you usually talk back from JavaScript is by opening a fictional URL (by window.location), and then implementing UIWebViewDelegate's -webView:shouldStartLoadWithRequest:navigationType: to ignore the navigation and handle what needs to be done instead.

(On Mac OS X WebKit, you can supply Objective-C objects that have JavaScript functions to the web site, but this is not available in iOS.)

PhoneGap was built exactly for this

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!