无法在 Phonegap 中从 javascript 调用本机函数

Posted

技术标签:

【中文标题】无法在 Phonegap 中从 javascript 调用本机函数【英文标题】:Unable to invoke native functions from the javascript, in Phonegap 【发布时间】:2012-10-08 07:09:37 【问题描述】:

这就是我所做的:

1) 已安装 Cordova 2.0.0 版

2) 我的 XCode 版本是 4.3.3

3) 通过 ./create 命令创建了电话间隙项目。

4)index.html:

<script   type="text/javascript">

    function nativePluginResultHandler (result) 
     
        alert("SUCCESS: \r\n"+result ); 
     

    function nativePluginErrorHandler (error) 
     
        alert("ERROR: \r\n"+error ); 
     

    function callNativePlugin( returnSuccess ) 
     
        alert("Invoking..");
        HelloPlugin.callNativeFunction( nativePluginResultHandler, nativePluginErrorHandler, returnSuccess ); 
     
</script>


<h1>Hey, it's Cordova!</h1>  
<button onclick="callNativePlugin('success');">Click to invoke the Native Plugin with an SUCCESS!</button>  
<button onclick="callNativePlugin('error');">Click to invoke the Native Plugin with an ERROR!</button> 

5)内部HelloPlugin.js

var HelloPlugin =  
    callNativeFunction: function (success, fail, resultType)  
        echo "Welcome";
        return Cordova.exec( success, fail, "com.mycompany.HelloPlugin", "nativeFunction", [resultType]); 
     ; 

6) HelloPlugin.m:

#import "HelloPlugin.h"

@implementation HelloPlugin

- (void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options  
    //get the callback id 
    NSString *callbackId = [arguments pop]; 
    NSLog(@"Hello, this is a native function called from PhoneGap/Cordova!"); 
    NSString *resultType = [arguments objectAtIndex:0]; 
    CDVPluginResult *result; 
    if ( [resultType isEqualToString:@"success"] ) 
     
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"Success :)"]; 
        [self writeJavascript:[result toSuccessCallbackString:callbackId]]; 
     else  
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString: @"Error :("]; 
        [self writeJavascript:[result toErrorCallbackString:callbackId]]; 
    
 

@end

7) HelloPlugin.h:

#import "Cordova/CDVPlugin.h"
#import "Cordova/CDV.h"

@interface HelloPlugin : CDVPlugin


- (void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;


@end

8)Cordova.plist 中,我添加了以下键/值:

com.mycompany.HelloPlugin        HelloPlugin

问题是来自HelloPlugin 的本机函数根本没有被调用。

我在这里错过了什么?

非常感谢您的帮助。

【问题讨论】:

嗨!您是否尝试在 Cordova.plist 文件的插件部分添加 HelloPluginHelloPlugin,而不是 com.mycompany.HelloPluginHelloPlugin Littm,我试过了,但仍然没有调用。 您在控制台上是否遇到任何错误? Littm,我没有收到任何错误 littm :(. 跟项目名/产品名/bundle id有关系吗? 【参考方案1】:

您可以尝试以下方法:

1 - 在您的文件 Cordova.plist 中,将以下键/值添加到 Plugin 部分:

HelloPlugin                      HelloPlugin

代替:

com.mycompany.HelloPlugin        HelloPlugin

2 - 将您的 javascript 文件 HelloPlugin.js 的内容更改为以下内容:

var HelloPlugin =  
    callNativeFunction: function (success, fail, resultType)  
        console.log ("Welcome");
        return Cordova.exec( success, fail, "HelloPlugin", "nativeFunction", [resultType]); 
     ;

3 - 将您的 HTML 文件 index.html 更改为以下内容:

<html>
    <header>

        <script type="text/javascript" src="./js/HelloPlugin.js"></script>

        <script   type="text/javascript">

            document.addEventListener("deviceready",onDeviceReady,false);

            function onDeviceReady()
            
                // do your thing!
                alert("Cordova is working")
            

            function nativePluginResultHandler (result) 
             
                alert("SUCCESS: \r\n"+result ); 
             

            function nativePluginErrorHandler (error) 
             
                alert("ERROR: \r\n"+error ); 
             

            function callNativePlugin( returnSuccess ) 
             
                alert("Invoking..");
                HelloPlugin.callNativeFunction( nativePluginResultHandler, nativePluginErrorHandler, returnSuccess ); 
             
        </script>
    </header>

    <body>

        <h1>Hey, it's Cordova!</h1>  
        <button onclick="callNativePlugin('success');">Click to invoke the Native Plugin with an SUCCESS!</button>  
        <button onclick="callNativePlugin('error');">Click to invoke the Native Plugin with an ERROR!</button> 

    </body>
</html>

希望这会有所帮助。让我知道这是否有效。

另外,我发现了这个链接,我想你可能会觉得它很有趣:

http://www.adobe.com/devnet/html5/articles/extending-phonegap-with-native-plugins-for-ios.html

您可以从上面的链接下载一个示例代码,这可能很有用:)。

【讨论】:

嘿Littm,感谢您的帮助。我真傻。我没有正确更新 javascript 路径,它现在可以工作。优秀的帮助老兄准时。接受答案。:)【参考方案2】:

[1] 确保您已在 index.html(您的入口 html 页面)中导入“cordova.js”

[2] 您可以通过 cordova.plist 或 config.xml

添加自定义插件

=> 对于cordova.plist

键 - 值

HelloPlugin - HelloPlugin

[OR]

=> 对于 config.xml ,添加下面的功能标签

<feature name="HelloPlugin">
      <param name="ios-package" value="HelloPlugin" />
      <param name="onload" value="true" />
</feature>

[3] 然后对 HelloPlugin.mHelloPlugin.h

中的以下函数进行更改
-(void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options  

到,

- (void) nativeFunction:(CDVInvokedUrlCommand*)command 

CDVPluginResult* pluginResult = nil;
NSString* echo = [command.arguments objectAtIndex:0];

if (echo != nil && [echo length] > 0) 
    //pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@"Sandip"];
 else 
    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];



if ( [echo isEqualToString:@"success"] )

    NSLog(@"Native log : success");
 else 
    NSLog(@"Native log : failed");


[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];

【讨论】:

以上是关于无法在 Phonegap 中从 javascript 调用本机函数的主要内容,如果未能解决你的问题,请参考以下文章

在 PhoneGap Build 中从 Facebook 获取信息

使用 NSString 变量在 PhoneGap 中从 Objective C 编写 JavaScript

如何在我的 phonegap 应用程序中从网页导航到本地页面?

离线使用 jQuery 手机

Phonegap 恢复应用程序崩溃

如何在带有 cordova 的 iOS 设备中从 iCloud 读取文件?