Objective-C 到 JavaScript 调用没有发生
Posted
技术标签:
【中文标题】Objective-C 到 JavaScript 调用没有发生【英文标题】:Objective-C to JavaScript call not happening 【发布时间】:2013-01-03 06:41:53 【问题描述】:我正在使用 Phonegap/Cordova(2.1.0) 创建 ios 应用程序。我想从 Objective-C 函数调用 Phonegap 的 index.html 文件中的 javascript 函数。所以,我正在创建一个“UIWebView”类的实例“theWebView”,如下所示:
AppDelegate.h 中的代码:
#import <UIKit/UIKit.h>
#import <Cordova/CDVViewController.h>
#import "sqlite3.h"
@interface AppDelegate : NSObject < UIApplicationDelegate >
NSString* invokeString;
@property (nonatomic, strong) IBOutlet UIWebView* theWebView;
AppDelegate.m 中的代码:
#import "AppDelegate.h"
#import "MainViewController.h"
#import <Cordova/CDVPlugin.h>
@implementation AppDelegate
@synthesize theWebView;
调用JavaScript函数的代码如下:
// to call javascript function
[theWebView stringByEvaluatingJavaScriptFromString:@"myJavascriptFunction()"];
代码已成功构建。但是,在 index.html 的脚本标签中定义的 JavaScript 函数“myJavascriptFunction()”没有被调用。我该怎么做?
我还附上了 Web 视图加载代码,它存在于 MainViewController.m 文件中。由于我使用的是 Cordova 2.1.0,因此 ViewController 和 AppDelegate 存在单独的文件 类。
/**
Called when the webview finishes loading. This stops the activity view and closes the imageview
*/
- (void)webViewDidFinishLoad:(UIWebView *)theWebView
NSLog(@"webViewDidFinishLoad function");
// Black base color for background matches the native apps
theWebView.backgroundColor = [UIColor blackColor];
return [ super webViewDidFinishLoad:theWebView ];
- (void)webViewDidStartLoad:(UIWebView *)theWebView
NSLog(@"webViewDidStartLoad function");
return [ super webViewDidStartLoad:theWebView ];
/**
* Fail Loading With Error
* Error - If the webpage failed to load display an error with the reason.
*/
- (void)webView:(UIWebView *)theWebView didFailLoadWithError:(NSError *)error
NSLog(@"didFailLoadWithError function");
return [ super webView:theWebView didFailLoadWithError:error ];
/**
* Start Loading Request
* This is where most of the magic happens... We take the request(s) and process the response.
* From here we can redirect links and other protocols to different internal methods.
*/
- (BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
NSLog(@"shouldStartLoadWithRequest function");
// Intercept custom location change, URL begins with "js-call:"
if ([[[request URL] absoluteString] hasPrefix:@"js-call:"])
// Call the given selector
[[[UIApplication sharedApplication] delegate] performSelector:NSSelectorFromString(@"resetBadgeCount")];
// Cancel the location change
return NO;
// Accept this location change
return YES;
index.html 中围绕 javascript 函数 'myJavascriptFunction' 的代码:
<!DOCTYPE html>
<html>
<head>
<title>Index Page</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="stylesheet" href="iui/iui.css" type="text/css" media="all"/>
<link rel="stylesheet" title="Default" href="iui/t/default/default-theme.css" type="text/css" media="all"/>
<link rel="stylesheet" href="iui/t/default/iui-custom.css" type="text/css" media="all"/>
<script type="text/javascript" src="cordova-2.1.0.js"></script>
<script type="text/javascript">
function myJavascriptFunction()
alert('myJavascriptFunction');
return;
</script>
</head>
<body id="bd">
</body>
</html>
我附上 Objective-C 代码来加载 index.html 文件,然后调用 JavaScript 函数:
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"www"];
NSURL *baseURL = [NSURL fileURLWithPath:path];
NSString *myFile = [path stringByAppendingPathComponent:@"index.html"];
NSLog(@"base url= %@",myFile);
NSData *myFileData = [[NSData alloc] initWithContentsOfFile:myFile];
NSString* myFileHtml = [[NSString alloc] initWithData:myFileData encoding:NSASCIIStringEncoding];
[theWebView loadHTMLString:myFileHtml baseURL:baseURL];
// to call javascript function
[theWebView stringByEvaluatingJavaScriptFromString:@"onDeviceReady()"];
我认为问题出在最后一行。
【问题讨论】:
显示加载 WebView 的代码 嗨,我尝试了同样的事情,你最后是如何让它工作的? 【参考方案1】:我认为您对这段代码没有问题。在这里一切看起来都不错,但是如果工作正常,您应该检查您正在调用的myJavascriptFunction()
。您可以从带有 JavaScript 控制台的浏览器尝试,看看它在手动调用时是否可以工作。
例如适用于我的 myJavascriptFunction 代码是:
function myJavascriptFunction()
window.location = "http://www.google.com/";
虽然警报代码没有显示任何警报,特别是UIAlertView
。
关于警报,我在这里得到纠正,UIAlertView 显示在 Javascript 警报事件中。
【讨论】:
它在 index.html 的 script 标签中。我不太确定它是否会在此处查找 javascript 函数。我还附上了 index.html 代码。这个问题对我来说非常重要。它已成为一个巨大的瓶颈,如果不解决它,我将无法进一步发展。谢谢。 就像我说的,错误在 Javascript 代码中。您不能通过在 Javascript 中调用alert
来调用 UIAlertView
。要调用它,您需要在委托中实现它。
所以你的意思是说 alert() 不起作用。但除此之外,在 js 函数中编写的普通 javascript 代码将可以工作..对吗?如果你能详细说明一下,我将不胜感激。无论如何,我的代码中不需要 alert() 。那只是为了测试。
那么它必须与您的phonegap/cordova有关。在此处查看适用于 UIAlertView 和重定向的示例项目。在此处查看示例:cl.ly/001B0i3r0p3Y
@AmarKulo 您好,感谢您的回复,我使用了不同的方法并解决了这个问题。以上是关于Objective-C 到 JavaScript 调用没有发生的主要内容,如果未能解决你的问题,请参考以下文章
在 Objective-C 中更改 Javascript 变量
如何在 Objective-C 中运行 javascript 文件?
javascript将字符串传递给本机objective-c