oc调js方法方法一:
NSString *jsStr = [NSString stringWithFormat:@"前端定义方法名('%@')", @"参数"];
[self.webView stringByEvaluatingJavaScriptFromString:jsStr];
方法二:(使用JavaScriptCore库)
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *textJS = @"showAlert('这里是JS中alert弹出的message')";[context evaluateScript:textJS];
js调oc方法在webview加载完成的时候
- (void)webViewDidFinishLoad:(UIWebView *)webView{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; context[@"ZjeIot"] = self.webViewJS;
}
///定义的一个类,用于方法关联
- (IOTDeviceWebViewJS *)webViewJS{
if (!_webViewJS) {
_webViewJS = [[IOTDeviceWebViewJS alloc] init];
}
return _webViewJS;
}
IOTDeviceWebViewJS.h 代码如下
@protocol IOTWebViewJSProtocol
// 设备信息
JSExportAs(getInfoFromApp, - (NSString *)getInfoFromApp:(NSString *)i);
// 控制设备
JSExportAs(deviceControl, -(void)deviceControl:(NSString *)str);
// 设备状态变更//JSExportAs(deviceStatusChange, - (void)deviceStatusChange:(NSString *)i);
@end
@interface IOTDeviceWebViewJS : NSObject
@property (strong, nonatomic) NSString *deviceId;
@property (strong, nonatomic) NSString *appInfoStr;
@end
IOTDeviceWebViewJS.m 代码如下
#import "IOTDeviceWebViewJS.h"
@implementation IOTDeviceWebViewJS
- (NSString *)getInfoFromApp:(NSString *)i {
return @"前端想要的信息";
}
-(void)deviceControl:(NSString *)str {
//前端想执行的操作
}
@end
以上是交互的流程。其实细心的话已经没有后续了。我想说的就是OC调js的时候参数的格式要注意。我想爆粗口(为了社会文明忍下)《》
调用前端方式的时候因为要传字符串的格式,然后数据原先格式是接口请求出来的字典、或者数组。转的流程:(以字典为例)
NSDictionary *dic = @{@"appid":@"103905", @"tokenid":@"1", @"version":@"1", @"sign":@"1"};
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *str = [[NSString alloc] initWithData:JSONData encoding:NSUTF8StringEncoding];
一切都一如既往的正常,但是你要注意这样转之后的字符串中有\n符号,然后这个字符串要作为参数,带特殊字符的字符串作为参数是传递不成功的。然后就导致了各种试各种改就是不行。
解决方法有多种,反正去掉特殊字符就行了:
1. NSMutableString *mutStr = [NSMutableString stringWithString:jsonString];
NSRange range = {0,jsonString.length};
//去掉字符串中的空格
[mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range];
NSRange range2 = {0,mutStr.length};
//去掉字符串中的换行符
[mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2];
2.NSData *JSONData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:nil]; (对应的NSJSONWritingPrettyPrinted改为0)
码码不易,且码且仔细。各位大佬谨慎点。其实这个和前端联调的话肯定很快就能发现这个问题,因为前端请假的原因只能自己试着改。(在本地写个demo一些都正常,就是没想到会是参数的问题;想到了js方法放在html文件和放在js文件对方法调用的影响;js文件获取的路径、会不会是js文件没找到,仔细想想前端调oc的正常,没理由oc调js的不行;把方法放在闭包里...各种尝试)这tmd怎么找……,愁死人!菜鸡程序猿真是毁青春、耗精力、费时间、磨耐心。赶快向大神进发