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

Objective-C与JavaScript交互的那些事

使用 UIWebView 让 Objective-C 与 JavaScript 对话

iOS中使用JavaScriptCore实现Objective-C和JavaScript的相互调用