新浦京81707con > 软件下载 > WebView交互总结

原标题:WebView交互总结

浏览次数:155 时间:2020-04-15

自家感觉一旦交互简单就能够,笔者就可以专一吃鸡!

图片 1美好吃鸡,天天向上.gif

您认为的连接你以为的,干活喽!吃鸡能咋的,并不能够!

上面看看哪些背景,须要,导致本人得把那么些相互作用,原原本本的又梳理了三回。

认识JavaScriptCore.framework

githubDemo:https://github.com/wangjinshan/JSCDemo

OC与JS人机联作有三种艺术,WKWebView和UIWebView,由于UIWebView相比耗内存,质量上不太好,所以苹果在iOS 第88中学出产了WKWebView。

背景

品种要在11.11那个大节近期上线商场效率,东西很多,所以有个别机能接收H5,那样分担部分移动端义务。

连串示范

图片 2

11.gif

图片 3

94E8E789-02BE-4C1B-80A0-B5272F19BA47.png

图片 4

107BFC2C-26E3-4395-BE81-8EFD558D3F52.png

在UIWebView与JS人机联作中最简便的法门正是拦截USportageL,根据h5那边约定好的url来推断客户实际进行了哪些操作。代码如下:

需求
  • 成就网页中有个别活动下的货品点击进入商品详细的情况
  • 成功单个网页的动态化分享内容
  • 后台最棒写一套内容,完结安卓,iOS 两端同有的时候候可互相

正文

JavaScriptCore.framework 是苹果在ios7随后新增的框架,是对 UIWebView的一遍封装,方便开垦者使用,使用JavaScriptCore.framework能够轻易完毕ios与js的并行

- webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSURL *URL = request.URL; NSString *scheme = [URL scheme];//url可以是单纯字符串,也可以是带参数的url,这样就可以传值给oc,但是需要根据‘&’和‘=’将url拆分获得参数,再进行后续操作 if ([scheme isEqualToString:@"userLogin"]) { //此处调用oc原生方法,比如字符串是用户登陆,那就掉用登陆方法 [self login:URL]; return NO; } return YES;}- login:URL{ //拆分参数 NSArray *params =[URL.query componentsSeparatedByString:@"&"]; NSMutableDictionary *tempDic = [NSMutableDictionary dictionary]; for (NSString *paramStr in params) { NSArray *dicArray = [paramStr componentsSeparatedByString:@"="]; if (dicArray.count > 1) { NSString *decodeValue = [dicArray[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [tempDic setObject:decodeValue forKey:dicArray[0]]; } } // 登陆获取用户id NSString *userId = [self getUserid]; // 传值给js, setUserId是跟js约定好的方法名 NSString *jsStr = [NSString stringWithFormat:@"setUserId",userId]; [self.webView stringByEvaluatingJavaScriptFromString:jsStr];}
主题素材,以至清除
  1. 三个onclick的网页人机联作没问题,接纳上面JS那些库,没难点,然则多参数,安卓,iOS的艺术格式不太类似

---须求减轻措施统一的主题素材

缓和:iOS将艺术分解成多参数的,下面具体说了,就了然了。

JavaScriptCore的组成

JavaScriptCore中要害的类

图片 5

java.png

详细介绍
1, JSContext --- 在OC中创立JavaScript运维的上下文情形

// 创建JSContext对象,获得JavaScript运行的上下文环
- (instancetype)init; 
// 在特定的对象空间上创建JSContext对象,获得JavaScript运行的上下文环境
- (instancetype)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;
// 运行一段js代码,输出结果为JSValue类型
- (JSValue *)evaluateScript:(NSString *)script;
// iOS 8.0以后可以调用此方法
- (JSValue *)evaluateScript:(NSString *)script withSourceURL:(NSURL *)sourceURL NS_AVAILABLE(10_10, 8_0);
// 获取当前正在运行的JavaScript上下文环境
  (JSContext *)currentContext;
// 返回结果当前执行的js函数 function () { [native code] } ,iOS 8.0以后可以调用此方法
  (JSValue *)currentCallee NS_AVAILABLE(10_10, 8_0);
// 返回结果当前方法的调用者[object Window]
  (JSValue *)currentThis;
// 返回结果为当前被调用方法的参数
  (NSArray *)currentArguments;
// js的全局变量 [object Window]
@property (readonly, strong) JSValue *globalObject;
// 返回js 调用时候的异常信息
@property (copy) void(^exceptionHandler)(JSContext *context, JSValue *exception);
//  异常捕获中错误值处理
@property (strong) JSValue *exception;
// 上下文的名字
@property (copy) NSString *name NS_AVAILABLE(10_10, 8_0);

JSValue --- JavaScript中的变量和方式,能够转成OC数据类型,每一种JSValue都和JSContext相关联並且强引用context
OC 和 js 数据比较表

Objective-C type JavaScript type
nil undefined
NSNull null
NSString string
NSNumber number, boolean
NSDictionary Object object
NSArray Array object
NSDate Date object
NSBlock (1) Function object (1)
id (2) Wrapper object (2)
Class (3) Constructor object (3)
// 在context创建BOOL的JS变量
  (JSValue *)valueWithBool:(BOOL)value inContext:(JSContext *)context;
// 修改JS对象的属性的值
- (void)setValue:(id)value forProperty:(NSString *)property;
// 调用者JSValue对象为JS中的方法名称,arguments为参数,调用JS中Window直接调用的方法
- (JSValue *)callWithArguments:(NSArray *)arguments;
// 调用者JSValue对象为JS中的全局对象名称,method为全局对象的方法名称,arguments为参数
- (JSValue *)invokeMethod:(NSString *)method withArguments:(NSArray *)arguments;
// JS中的结构体类型转换为OC
  (JSValue *)valueWithPoint:(CGPoint)point inContext:(JSContext *)context;
// 将JS变量转换成OC中的BOOL类型/提供了其他方法的转换
- (BOOL)toBool;
 // JS中是否有这个对象
// @property (readonly) BOOL isUndefined;
// 比较两个JS对象是否相等
- (BOOL)isEqualToObject:(id)value;

3, JSExport --- JS调用OC中的方法和性格写在继续自JSExport的商酌在这之中,OC对象落成自定义的公约

官方给的例子
//@textblock
    @protocol MyClassJavaScriptMethods <JSExport>
    - (void)foo;
    @end
  // 方法实现
    @interface MyClass : NSObject <MyClassJavaScriptMethods>
    - (void)foo;
    - (void)bar;
    @end
//@/textblock

4, JSManagedValue --- JS和OC对象的内部存款和储蓄器管理扶植对象,主要用来保存JSValue对象,消除OC对象中积累js的值,诱致的循环引用问题

// 初始化
- (instancetype)initWithValue:(JSValue *)value;
  (JSManagedValue *)managedValueWithValue:(JSValue *)value;
  (JSManagedValue *)managedValueWithValue:(JSValue *)value andOwner:(id)owner NS_AVAILABLE(10_10, 8_0);

JSManagedValue本人只弱援引js值,须要调用JSVirtualMachine的addManagedReference:withOwner:把它加多到JSVirtualMachine中,那样若是JavaScript能够找到该JSValue的Objective-C owner,该JSValue的援用就不会被放走

5, JSVirtualMachine --- JS运维的虚构机,有独立的堆空间和垃圾回笼机制,运维在分化虚构机处境的JSContext能够由此此类通讯。

// 初始化
- (instancetype)init;
// 添加
- (void)addManagedReference:(id)object withOwner:(id)owner;
 //  移除
 - (void)removeManagedReference:(id)object withOwner:(id)owner;

到此 JavaScriptCore.framework 可以运用的基本api已经介绍落成


下边我们以简单集成SMSDK为 实际例子进行讲授
率先创立供给的八个文本 SMSDK.html/ SMSDK.cc SMSDK.js 在viewDidLoad中成立webview进行加载SDMSDK.html

例如回调实行的JS 方法带参数,而参数不是字符串时,不要加单引号,不然可能引致调用JS 方法失利

本文由新浦京81707con发布于软件下载,转载请注明出处:WebView交互总结

关键词: 新浦京81707con js OC WKWebView 交互

上一篇:UIActivityIndicatorView活动指示器,刷新轮的使用

下一篇:没有了