将值从 iOS 本机代码传递给 cordova
Posted
技术标签:
【中文标题】将值从 iOS 本机代码传递给 cordova【英文标题】:passing value from iOS native code to cordova 【发布时间】:2012-07-25 18:09:30 【问题描述】:我有一些从我的本机代码生成的值,我想传递给 phonegap。这些数据是实时生成的,不会直接受到用户通过 phonegap gui 的操作的影响。我的原生代码是我制作的插件的一部分。
解决此问题的最佳方法是什么?我想要一个随时发送数据的功能,并在科尔多瓦一侧有一个监听器。我将 Cordova 1.5 与 Xcode 4.3 一起使用。
这是我目前所拥有的:
swipe.js:
var swipe=
callNativeFunction: function (success, fail, resultType)
return Cordova.exec( success, fail,
"ca.swipe",
"nativeFunction",
[resultType]);
;
index.html:
...
function callNativePlugin( returnSuccess )
swipe.callNativeFunction( nativePluginResultHandler, nativePluginErrorHandler, returnSuccess );
function nativePluginResultHandler (result)
alert("SUCCESS: \r\n"+result );
function nativePluginErrorHandler (error)
alert("ERROR: \r\n"+error );
... <body onload="onBodyLoad()"> <h1>Hey, it's Cordova!</h1>
<button onclick="callNativePlugin('success');">Success</button>
<button onclick="callNativePlugin('error');">Fail</button>
</body> ...
swipe.h:
...
@interface swipe : CDVPlugin
- (void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
@end
swipe.m:
...
- (void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
NSLog(@"Hello, this is a native function called from PhoneGap/Cordova!");
//get the callback id
NSString *callbackId = [arguments pop];
NSString *resultType = [arguments objectAtIndex:0];
NSMutableArray *GlobalArg=arguments;
CDVPluginResult *result;
if ( [resultType isEqualToString:@"success"] )
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"Success :)"];
//writes back the smiley face to phone gap.
[self writejavascript:[result toSuccessCallbackString:callbackId]];
...
我现在拥有的代码不能做我想做的事。我不太确定如何在 cordova 和 native 中设置代码。
【问题讨论】:
您描述的方法听起来是一种非常合理的方法,这是唯一的问题还是您无法使其正常工作? @rhooligan 我无法让它工作,我对 Objective-C 及其与 phonegap 的交互不是很熟悉。有某种例子会很棒。谢谢! 您能发布您的 Objective-C 代码,然后向我们展示您的 Cordova 代码吗?当它仍然被称为 PhoneGap 时,我写了一些插件,并且你必须在捆绑包中做一些特定的事情,以及你需要从 JS 调用的初始化序列。不过,从那时起,系统可能已经发生了一些变化。 @rhooligan 刚刚发布了我的代码,感谢您的帮助! 你能告诉我你有解决办法吗?请在这里发帖,谢谢。 【参考方案1】:听起来你需要能够从目标 C 回话到 PhoneGap,在这种情况下你应该能够使用类似的东西:
NSString *jsResult = [theWebView stringByEvaluatingJavaScriptFromString:@"hello()"];
NSLog(@"jsResult=%@",jsResult);
如果你的 index.html 中有一个像“hello”这样的 JS 函数,如下所示:
function hello()return "hello";
这是一种与 PhoneGap 网络层对话的方式
【讨论】:
【参考方案2】:创建一个CDVPlugin
类型的类在该类中导入#import
初始化一个处理方法.h类
- (void)Device:(CDVInvokedUrlCommand *)command;
并在.m类中实现方法
- (void)openDevice:(CDVInvokedUrlCommand *)command
CDVPluginResult *pluginResult = nil;
BOOL checkOpenDevice=NO;
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:checkOpenDevice];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
这样通过self.commandDelegate你的数据就能到达cordova类 如果 .js 文件命中(调用)在 .h 类中初始化的特定方法。
【讨论】:
以上是关于将值从 iOS 本机代码传递给 cordova的主要内容,如果未能解决你的问题,请参考以下文章