javascript call objc

44
iOS dev HACK! JS调用ObjC [email protected] 11年1月23日星期日

Upload: lin-luxiang

Post on 18-Nov-2014

3.002 views

Category:

Documents


0 download

DESCRIPTION

A way of calling objc function from js in UIWebView.

TRANSCRIPT

Page 1: Javascript call ObjC

iOS dev HACK!JS调用ObjC

[email protected]

11年1月23日星期日

Page 2: Javascript call ObjC

源起

11年1月23日星期日

Page 3: Javascript call ObjC

源起

HTML做界面很爽

11年1月23日星期日

Page 4: Javascript call ObjC

源起

HTML做界面很爽

JS相对Objc慢

11年1月23日星期日

Page 5: Javascript call ObjC

源起

HTML做界面很爽

JS相对Objc慢

UIWebView功能弱

11年1月23日星期日

Page 6: Javascript call ObjC

方法一

11年1月23日星期日

Page 7: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

11年1月23日星期日

Page 8: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

11年1月23日星期日

Page 9: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

11年1月23日星期日

Page 10: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

11年1月23日星期日

Page 11: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

}

11年1月23日星期日

Page 12: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

}

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector

11年1月23日星期日

Page 13: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

}

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name

11年1月23日星期日

Page 14: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

}

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name

11年1月23日星期日

Page 15: Javascript call ObjC

方法一

在JS的Global中强势插入对象。

- (void)webView:(id)sender didClearWindowObject:(id)windowObject forFrame:(WebFrame*)frame {

! [windowObject setValue:localcall forKey:@"localcall"];

}

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name

11年1月23日星期日

Page 16: Javascript call ObjC

失败原因

11年1月23日星期日

Page 17: Javascript call ObjC

失败原因

Apple限制了方法的调用。

11年1月23日星期日

Page 18: Javascript call ObjC

失败原因

Apple限制了方法的调用。

在+ (BOOL)isSelectorExcludedFromWebScript:

(SEL)aSelector中,aSelector为空。

11年1月23日星期日

Page 19: Javascript call ObjC

方法二

11年1月23日星期日

Page 20: Javascript call ObjC

方法二

既然方法调用不成功,那么通过访问属性触发

可行吗?

11年1月23日星期日

Page 21: Javascript call ObjC

方法二

既然方法调用不成功,那么通过访问属性触发

可行吗?

触发完成以后,通过设置属性返回值。

11年1月23日星期日

Page 22: Javascript call ObjC

方法二

既然方法调用不成功,那么通过访问属性触发

可行吗?

触发完成以后,通过设置属性返回值。

11年1月23日星期日

Page 23: Javascript call ObjC

失败原因

11年1月23日星期日

Page 24: Javascript call ObjC

失败原因

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name 这是个类方法,无法发送消息给实例。

11年1月23日星期日

Page 25: Javascript call ObjC

失败原因

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name 这是个类方法,无法发送消息给实例。

静态方法只能访问静态值。

11年1月23日星期日

Page 26: Javascript call ObjC

失败原因

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name 这是个类方法,无法发送消息给实例。

静态方法只能访问静态值。

静态值不能在JS中被访问到。

11年1月23日星期日

Page 27: Javascript call ObjC

方法三

11年1月23日星期日

Page 28: Javascript call ObjC

方法三

模拟RPC。

11年1月23日星期日

Page 29: Javascript call ObjC

方法三

模拟RPC。

利用类似http://localcall/func_name?

argument=”a_json_string”进行方法调用。

11年1月23日星期日

Page 30: Javascript call ObjC

方法三

模拟RPC。

利用类似http://localcall/func_name?

argument=”a_json_string”进行方法调用。

11年1月23日星期日

Page 31: Javascript call ObjC

Ajax方式

11年1月23日星期日

Page 32: Javascript call ObjC

Ajax方式

提交XMLHttpRequest请求。

11年1月23日星期日

Page 33: Javascript call ObjC

Ajax方式

提交XMLHttpRequest请求。

截获请求并处理。

11年1月23日星期日

Page 34: Javascript call ObjC

Ajax方式

提交XMLHttpRequest请求。

截获请求并处理。

一般的方法无法截取,必须通过截取Cache。

11年1月23日星期日

Page 35: Javascript call ObjC

Ajax方式

提交XMLHttpRequest请求。

截获请求并处理。

一般的方法无法截取,必须通过截取Cache。

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

11年1月23日星期日

Page 36: Javascript call ObjC

Callback方式

11年1月23日星期日

Page 37: Javascript call ObjC

Callback方式

直接更改window.location.href

11年1月23日星期日

Page 38: Javascript call ObjC

Callback方式

直接更改window.location.href

截获请求

11年1月23日星期日

Page 39: Javascript call ObjC

Callback方式

直接更改window.location.href

截获请求

- (BOOL)webView:(UIWebView *)webView2 shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType。

11年1月23日星期日

Page 40: Javascript call ObjC

Callback方式

直接更改window.location.href

截获请求

- (BOOL)webView:(UIWebView *)webView2 shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType。

仅有这个是不够的,因为[webview loadData]无法正确返回结果。

11年1月23日星期日

Page 41: Javascript call ObjC

Callback方式

直接更改window.location.href

截获请求

- (BOOL)webView:(UIWebView *)webView2 shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType。

仅有这个是不够的,因为[webview loadData]无法正确返回结果。

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

11年1月23日星期日

Page 42: Javascript call ObjC

其他方式

Form表单提交

Iframe

Script标签

原理都一样,不能用webview截取的请求,就利

用cache截取。

11年1月23日星期日

Page 43: Javascript call ObjC

高潮

11年1月23日星期日