iOS開發 UIWebView+JavaScript 交互總結


算是個人項目經驗的,印象比較深的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM