I am new programmer to objective C. I added some html file to Objective C. In this html file contains simple javascript function. I need to call that Function through thw ob
One can use JavaScriptCore framework to run JavaScript code from Objective-C.
#import <JavaScriptCore/JavaScriptCore.h>
...
JSContext *context = [[JSContext alloc] init];
[context evaluateScript: @"function greet(name){ return 'Hello, ' + name; }"];
JSValue *function = context[@"greet"];
JSValue* result = [function callWithArguments:@[@"World"]];
[result toString]; // -> Hello, World
Here is a demo:
https://github.com/evgenyneu/ios-javascriptcore-demo
FileName.js :
function greet() {
hello(“This is Javascript function!”);
}
Copy this file into Bundle resources.
Now #import <JavaScriptCore/JavaScriptCore.h>
in header file
@property (nonatomic,strong) JSContext *context; // Declare this in header file
// This code block goes into main file
NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"FileName" ofType:@"js"];
NSString *scriptString = [NSString stringWithContentsOfFile:scriptPath encoding:NSUTF8StringEncoding error:nil];
self.context = [[JSContext alloc] init];
[self.context evaluateScript:scriptString];
self.context[@"hello"] = ^(NSString text) {
NSLog(@"JS : %@",text);
}
JSValue *function = self.context[@"greet"];
[function callWithArguments:@[]];
This code block worked for me. It displays "This is Javascript function!" in console. Hope this works!
NSString *path;
NSBundle *thisBundle = [NSBundle mainBundle];
path = [thisBundle pathForResource:@"first" ofType:@"html"];
NSURL *instructionsURL = [NSURL fileURLWithPath:path];
[webView loadRequest:[NSURLRequest requestWithURL:instructionsURL]];
NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"];
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];
[webView stringByEvaluatingJavaScriptFromString:@"myFunction()"];
If all this code called from single place, than it won't work, because page load is asynchronous and page with JavaScript code is not ready at that moment.
Try to call this methods [webView stringByEvaluatingJavaScriptFromString:@"myFunction()"];
in UIWebViewDelegate callback method –webViewDidFinishLoad:
Try this:
NSString *jsCallBack = [NSString stringWithFormat:@"setPhoto('%@')",profileImgPath];
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" charset="utf-8" src="your.js"></script>
<script type="text/javascript" charset="utf-8" src="andYourJsfileName.js"></script>
<script>
function myFunction('yourParameter')
{
// do your javascript operation
//alert("my Hello World!");
return value;
}
</script>
</head>
<body>
<!--button onclick="myFunction()">Try it</button-->
</body>
Add a html file to project folder. Add your javascript file also to project folder.
After adding the html file and this native code to your viewController.m
-(void)loadMyWebView {
webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
NSString *path;
NSBundle *thisBundle = [NSBundle mainBundle];
path = [thisBundle pathForResource:@"first" ofType:@"html"];
NSURL *instructionsURL = [NSURL fileURLWithPath:path];
NSString* htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
webView.delegate=self;
[webView loadHTMLString:htmlString baseURL:instructionsURL];
// [self.view addSubview:webView]; (if you want to access the javascript function and don't want to add webview, you can skip that also.)
}
- (void)webViewDidFinishLoad:(UIWebView*)theWebView {
NSString* returnValue =[theWebView stringByEvaluatingJavaScriptFromString:@"myFunction('pass your parameter')"];
NSLog(@"returnValue = %@ ",returnValue);
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
NSLog(@" didFailLoadWithError");
}
Call this in your didLoad method [self loadMyWebView];
Here you can add any javascript file to the project and include it to the html file. You can call javascript function inside the tag. (exactly as you used to call js functions. )
You can pass any parameter to javascript function and return anything to objective function.
Remember ::: After adding all js file don't forget to add them to Copy Bundle Resources
To avoid warning ::: remove them from Compile Sources