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
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
PhoneGap was built exactly for this
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.)
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.