无法在 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 文件的插件部分添加HelloPlugin
和 HelloPlugin
,而不是 com.mycompany.HelloPlugin
和 HelloPlugin
?
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.m 和 HelloPlugin.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