算是個人項目經驗的,印象比較深的Web+JS交互的使用
iOS原生應用與Web頁面元素交互方式有很多,JavaScriptCore、攔截協議、第三方框架WebViewJavaScriptBridge、iOS8之后的WKWebView等;
簡要記錄下之前開發用到的兩種方式:
1. 劫持頁面加載,從 UIWebVIew 的 shouldStartLoadWithRequest 方法中攔截RequestURL 判斷加載項,代碼簡要:
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *urlStr = [[request URL] absoluteString];
// 加載的url 關鍵詞需要同后台約定
NSRange range_keyWord = [urlStr rangeOfString:@"opengood://"];
if (range_keyWord.length > 0) {
[self doSomeThing];
}
return YES;
}
2. iOS7之后水果公司推出的 JavaScriptCore 框架,交互起來hin方便
需要注意的是JS調用的方法名等需要同前端的同事溝通好,最好由前端提供給你。
淺顯的說,這個方式等同於將當前ViewController 注入到web的context中,不同webClick都能夠有不同的JS方法與VC上面的代理方法相對應,
例:
Web端
javaScript控件的點擊事件約定觸發 'task.openNewWeb('urlStr')'
“task”這個東西在web源碼中並沒有什么實際意義 它只相當於iOS端的某個viewController的占位符號
iOS端代碼:
#import <JavaScriptCore/JavaScriptCore.h>
UIWebView 代理方法中將當前控制器動態注入js中
- (void)webViewDidStartLoad:(UIWebView *)webView {
//首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)
JSContext * context =[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 控制器self 填充web中預留的占位符‘task’
self.context[@"task"] = self;
// 這時候javaScript控件的點擊事件約定觸發 'task.openNewWeb('urlStr')'
// 那么在OC語法中相當於 [self openNewWeb:urlStr];
self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"異常信息:%@", exceptionValue);
};
}
******** ⚠️ 注意:WEB JS交互crush
/*
* web點擊事件 'task.click()' ,OC中必須要有對應的方法聲明和實現,否則無法響應交互或導致crush
* 而且,在iOS10 以后 貌似加強了調度表查詢機制,所以聲明OC方法名的時候注意重復問題,
* 例如 openWeb:(int)index (NSString *)url 與 openWeb:(NSString *)url 形參數量存在差異,視為兩個不同方法
* 因為在OC消息傳遞機制中,self.openNewWeb() 首先是通過self 查找保存本身所有selector的調度表
* 若self的selectorNameList中並未找到js調用的task.selectorName ,則通過self的isa定位到superClass,繼續從super中的函數調度表 selectorNameList查詢
* superClass中仍未查到則繼續根據其isa順藤摸瓜找到super的元類繼續查找 如果元類中還沒有 拋出異常>> crush.nice - -b
*/
所以對於上面攔截web加載的方式,JavaScriptCore 的另一個優點就是提升代碼可讀性。。。
由於項目代碼內部有涉及到公司業務不方便貼出來,給大家提供兩個之前調研過的連接,里面有詳盡的JavaScriptCore 使用
鏈接1
http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=401786074&idx=1&sn=f03d52e7b4f980d694ed4a6b0e808d3b&scene=23&srcid=0309JfhgdIYEJ4vg1YY3OD2T#rd
鏈接2
http://mp.weixin.qq.com/s?plg_nld=1&plg_auth=1&plg_nld=1&plg_dev=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_uin=1&mid=403853462&plg_nld=1&idx=1&scene=23&plg_auth=1&__biz=MjM5Nzc1MzU2NA%3D%3D&plg_dev=1&srcid=0308AYX0Hpyq3w7TEdwDQ8z8&plg_usr=1&sn=f7437fe6fa45e62d86c026efa4aa1645&plg_vkey=1#rd
在很多頁面涉及web交互時,就要頻繁調用JS與ViewController關聯的方法
這個之前寫的一個web類目,提供下載鏈接,歡迎修改和完善
http://pan.baidu.com/s/1eRSt6p0