Call objective-c method from javascript
Solution 1
The most usual approach that I used to interact from javascript within obj-c is to changing hash. On required event in your js write
window.location.hash = '#cmd_alertMessage';
after this your - (BOOL)webView: shouldStartLoadWithRequest: navigationType:
will be called:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSArray * compenents = [request.URL.absoluteString componentsSeparatedByString:@"#"];
if (compenents.count > 1) {
NSString * cmd = compenents[1];
if ([cmd rangeOfString:@"cmd_alertMessage"].location != NSNotFound) {
// Call your obj-c method and get appropriated param
NSString * jsFunction = [NSString stringWithFormat:@"setParameterFromAAAMethod('%@')", [self aaa]];
// Return this param back to js
NSString * alertMessage = [webView stringByEvaluatingJavaScriptFromString:jsFunction];
}
}
return YES;
}
- (NSString *)aaa
{
return @"This is special parameter that you need";
}
So, it will work in 3 steps:
- Invoke hash changing to request parameter from obj-c code in js;
- Handle hash changed (parameter request) and return in back to js in obj-c;
- Handle recieved parameter in js again
Solution 2
Here is a quick and easy solution without JavaScriptCore for backwards compatibility (might consider upgrading to Javascriptcore ). Here's an easy implementation.
Note: this solution is for UIwebview only (not UIscrollview)
//viewcontroller.h
@interface ViewController : UIViewController<UIWebViewDelegate>
@property (strong, nonatomic) IBOutlet UIWebView *viewWeb;
@end
//viewcontroller.m
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *fullURL = @"http:player.fusion.fm";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[_viewWeb loadRequest:requestObj];
_viewWeb.delegate = self;
}
-(BOOL)webView:(UIWebView *)_viewWeb shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = request.URL;
if ([[url scheme] isEqualToString:@"ios"])
{
[self mute]; // <-- YOUR OBJ-C FUNCTION HERE
NSLog(@"test");
return YES;
}else
{
return YES;
}
}
// The Javascript (within webview)
try
{
window.location="ios://null"
}
catch(err)
{
}
Solution 3
You can set a hidden iframe's location to something specific to your app, and then intercept that request in Obj-C.
Here's an overview and some examples: http://blog.techno-barje.fr//post/2010/10/06/UIWebView-secrets-part3-How-to-properly-call-ObjectiveC-from-Javascript/
Mehman Bashirov
Updated on June 14, 2022Comments
-
Mehman Bashirov almost 2 years
I make any webView And I want to call from javascript any objective c method which return any parameter. I tried many ways but not allowed . Objective c method here:
- (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 UIAlertView *alert=[[ UIAlertView alloc] initWithTitle:@"iosdan javascripti" message:@"ddddddddd" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; //NSLog(@"%@", parameter); } return NO; } return YES; }
javascript:
function myFunction() { url="http://example.com"; window.location="donordialog:blooTypeChanged("+url+")"; }
html:
<button onclick="myFunction()">click me</button>
comment: I need that: it is obj c method for example. aaa{} . My aaa method must return any parameter. and I have wevView. I loaded any url to this webView: for example www.example.com/forios . I need call this (aaa) method from javascript which it is in html on www.example.com/forios and alert the result of aaa function. understand?. If understand, dont watch to my code. help please yourself anyway. android version of my question:Call Java function from JavaScript over Android WebView I want to alert some parameter returning from method. Help please. Thanks.
-
Mehman Bashirov about 10 yearsThanks for answer. But I want vise versa. I mean, write any method in obj c, whitch return any string or int parameter. And alert this parameter in javascript (webview). call this method from javascript whitch included to webview.
-
Mehman Bashirov about 10 yearserror:No visible interface for 'NSString' declares the selector 'isContainString'
-
Mehman Bashirov about 10 yearsThanks for answer. but I want vise versa. I did that o android. android version of my question:stackoverflow.com/questions/10389572/…
-
Mehman Bashirov about 10 yearsandroid version of my question:stackoverflow.com/questions/10389572/…
-
Mehman Bashirov about 10 yearsyou undertand my question right . How I'll alert this param in javascript? Full write please.
-
Mykola Denysyuk about 10 yearsI'm not really familiar with js, but:
function setParameterFromAAAMethod(parameter) { alert(parameter); }
-
Mehman Bashirov about 10 yearsnot called. Please check your answer again. please please. I'm in difficulty.
-
Mehman Bashirov about 10 yearsmay the problem is in - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType ?
-
Mykola Denysyuk about 10 yearsdid you set _webView's delegate?
-
Mykola Denysyuk about 10 yearsi mean,do you have code like
webView.delegate = self
? -
Mykola Denysyuk about 10 yearsso
- (BOOL)webView: shouldStartLoadWithRequest: navigationType:
will never be called. You must to set webView.delegate = <SelfOrOther>, whereSelfOrOther
must be an instance of class that has implementation of- (BOOL)webView: shouldStartLoadWithRequest: navigationType:
method. Also, read this article -
Mehman Bashirov about 10 yearswhere must put this code part? Iam not understand .
-
Mehman Bashirov about 10 yearsthanks for answers and comments. but now my problem is my problem yet.
-
Mykola Denysyuk about 10 yearsI recommend you read DOCUMENTATION first, to know how use UIWebView propperly