因为不认真,导致native与js交互遇到的坑

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怎么找……,愁死人!菜鸡程序猿真是毁青春、耗精力、费时间、磨耐心。赶快向大神进发

你可能感兴趣的:(因为不认真,导致native与js交互遇到的坑)