来自 iOS 4.0.0 中 Native 的 Cordova 插件 Javascript 函数调用
Posted
技术标签:
【中文标题】来自 iOS 4.0.0 中 Native 的 Cordova 插件 Javascript 函数调用【英文标题】:Cordova Plugin Javascript Function call from Native in iOS 4.0.0 【发布时间】:2016-01-28 15:56:35 【问题描述】:我正在尝试从 cordova ios 4.0.0 中的本机插件调用 javascript 函数。 在之前的cordova ios 3.9.2版本中,我可以像这样从本机插件调用任何javascript函数。
- (void)PlayMp3:(CDVInvokedUrlCommand*)command
NSString* callbackId = [command callbackId];
NSString* name = [[command arguments] objectAtIndex:0];
NSString* msg = [NSString stringWithFormat: @"Hello, %@", name];
CDVPluginResult* result = [CDVPluginResult
resultWithStatus:CDVCommandStatus_OK
messageAsString:msg];
MainViewController* viewController = (MainViewController*)self.viewController;
NSString *jsCallBack = [NSString stringWithFormat:@"setPlayStatus();"];
[viewController.webView stringByEvaluatingJavaScriptFromString:jsCallBack];
[self success:result callbackId:callbackId];
但在 Cordova iOS 4.0.0 中,我不能像上面那样调用 javascript 函数 setPlayStatus()
。因为viewController.webview
不是UIWebView
类型。它是UIView
。所以我试着喜欢这个。
- (void)PlayMp3:(CDVInvokedUrlCommand*)command
CDVPluginResult* pluginResult = nil;
NSString* echo = [command.arguments objectAtIndex:0];
if (echo != nil && [echo length] > 0)
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
else
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
WKWebView* webview = (WKWebView*)self.viewController.view;
NSString *jsCallBack = [NSString stringWithFormat:@"setPlayStatus();"];
[webview evaluateJavaScript:@"setPlayStatus();" completionHandler:nil];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
但它没有用。如何在 Cordova Plugin iOS 4.0.0 中调用原生 cordova 插件中的 javascript 函数?
【问题讨论】:
您遇到什么错误?是不是对象没有响应选择器evaluateJavaScript
?
【参考方案1】:
谢谢大家。我已经做到了。CDVPlugin
有一个commandDelegate
。这个commandDelegate
可以用evalJS
函数调用javascript
函数。
所以我就这样尝试了。
[self.commandDelegate evalJS:@"setPlayStatus()"];
之后,setPlayStatus()
函数被调用。
【讨论】:
【参考方案2】:我刚刚快速阅读了 Cordova iOS 插件代码,看起来 self.viewController.webView
通过 webEngine 持有一个 UIWebView。或许两者都可以。
您应该在投射前使用isKindOfClass:
进行检查。
编辑:更好:引擎是一个协议:
- (void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void (^)(id, NSError*))completionHandler;
用途:
[self.viewController.webViewEngine evaluateJavaScript:@"setPlayStatus();" completionHandler:nil]
【讨论】:
【参考方案3】:我自己试过了,这对我有用
[self.webViewEngine evaluateJavaScript:[NSString stringWithFormat:@"funcName(%@)",yourparam]]
【讨论】:
【参考方案4】:@Tim Rogers 的回答中有错字,应该是 evalJs 而不是 evalJS:
[self.commandDelegate evalJs:@"setPlayStatus()"];
在 Cordova ios 4.1.1 上运行良好
抱歉,我没有 50 个声望来添加评论,所以必须在此处添加新答案
【讨论】:
【参考方案5】:我遇到了同样的问题,我尝试使用下面的代码从本机调用 .js,然后我再次使用 Cordova.exec 发送参数
[self.webViewEngine evaluateJavaScript:[NSString stringWithFormat:@"setPlayStatus()"];
您必须在 config.xml 中添加以下功能
<feature name="setPlayStatus">
<param name="ios-package" value="setPlayStatus" />
<param name="onload" value="true" />
</feature>
这对我有用。
【讨论】:
以上是关于来自 iOS 4.0.0 中 Native 的 Cordova 插件 Javascript 函数调用的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Native 项目中 iOS 上的 libPhonenumber(来自 Google)
在windows上搭建react-native的android环境
react-native socket.io 来自节点服务器的无尽请求
javascript 来自https://facebook.github.io/react-native/docs/alert.html