本文目錄一覽:
- 1、iOS – OC 與 JS 交互六種方式總結
- 2、js怎麼跟Android和ios進行交互呢?
- 3、iOS 原生與JS交互 (webkit + js)
- 4、原生APP中js怎樣與Android和ios進行交互
- 5、iOS中WkWebView與js交互
iOS – OC 與 JS 交互六種方式總結
在 APP 中,免不了與 H5頁面打交道,所以掌握 與 JS 交互就顯的至關重要,本文總結了常見的與 JS 交互方式。
注意事項
在 OC 原生中
在 html 文件中
早期的JS與原生交互的開源庫很多都是用得這種方式來實現的,例如:PhoneGap、 WebViewJavascriptBridge 。
效果圖
使用WKNavigationDelegate中的代理方法,攔截自定義的 URL 來實現 JS 調用 OC 方法。
注意點
關於如何區分執行不同的OC 方法,也與UIWebView的處理方式一樣,通過URL 的host 來區分執行不同的方法:
JS 調用OC 方法後,有的操作可能需要將結果返回給JS。這時候就是OC 調用JS 方法的場景。
WKWebView 提供了一個新的方法 evaluateJavaScript:completionHandler: ,實現OC 調用JS 等場景。
注意點
運行結果
在iOS 7之後,apple添加了一個新的庫JavaScriptCore,用來做JS交互,因此JS與原生OC交互也變得簡單了許多。
首先導入JavaScriptCore庫, 然後在OC中獲取JS的上下文。
再然後定義好JS需要調用的方法,例如JS要調用share方法:
則可以在UIWebView載入url完成後,在其代理方法中添加要調用的share方法:
OC 調用 JS 方法有多種,首先介紹使用JavaScriptCore框架的方式。
使用JSContext 的方法 -evaluateScript ,可以實現 OC 調用 JS 方法
效果圖
使用WKWebView的時候,如果想要實現JS調用OC方法,除了攔截URL之外,還有一種簡單的方式。那就是利用WKWebView的新特性MessageHandler來實現JS調用原生方法。
創建 WKWebViewConfiguration 對象,配置各個API對應的MessageHandler。
然後在界面即將顯示的時候添加MessageHandler
需要注意的是addScriptMessageHandler很容易引起循環引用,導致控制器無法被釋放,所以需要移除MessageHandler
這裡實現了兩個協議 WKUIDelegate,WKScriptMessageHandler , WKUIDelegate 是因為我在JS中彈出了alert 。 WKScriptMessageHandler 是因為我們要處理JS調用OC方法的請求。
WKScriptMessage 有兩個關鍵屬性 name 和 body 。
因為我們給每一個OC 方法取了一個name,那麼我們就可以根據name 來區分執行不同的方法。body 中存著JS 要給OC 傳的參數。
關於參數body 的解析,我就舉一個body中放字典的例子,其他的稍後可以看demo。
解析JS 調用OC 實現分享的參數:
message.boby 就是JS 里傳過來的參數。我們不同的方法先做一下容錯性判斷。然後正常取值就可以了。
下面只列舉一個shareClick()方法,其他看Demo
這裡使用WKWebView 實現OC 調用JS方法與之前說的文章一樣,通過
– evaluateJavaScript:completionHandler:
效果圖如下圖所示
詳情看下面文章鏈接
iOS下 JS 與 OC 互相調用(五) – UIWebView+WebViewJavascriptBridge
詳情看下面文章鏈接
iOS下 JS 與 OC 互相調用(六) – WKWebView+WKWebViewJavascriptBridge
iOS下 JS 與OC 互相調用(一) – UIWebView 攔截 URL
iOS下 JS 與OC 互相調用(二) – JavaScriptCore
iOS 下 JS 與 OC 互相調用(三) – WKWebView 攔截 URL
iOS下JS與OC互相調用(四)-MessageHandler
iOS下 JS 與 OC 互相調用(五) – UIWebView+WebViewJavascriptBridge
iOS下 JS 與 OC 互相調用(六) – WKWebView+WKWebViewJavascriptBridge
js怎麼跟Android和ios進行交互呢?
Android和ios都是用navtive語言編寫的app,那麼調用js的方法如下:
Native 調用 JS:
本質就一個方法,通過 stringByEvaluatingJavaScriptFromString,都是同步。
1.通常方法:js修通過改doucument的loaction或者新建一個看不見的iFrame,修改它的 src,就會觸發回調 webView 的 shouldStartLoadWithRequest,參數 request 的 url 就是新賦值的 location 或者 url,上層截獲這個 url 的參數,對此分發即可。 這個都是非同步調用的。
如 JS function:
var messagingIframe;
messagingIframe = document.createElement(‘iframe’);
messagingIframe.style.display = ‘none’;
document.documentElement.appendChild(messagingIframe);
function TestIOSJS(){
messagingIframe.src = “ios/test/click”;
};
當觸發上面的JS時,webview會收到下面的回調:
– (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *url = request.URL.absoluteString;
if([url hasSuffix:@”ios/test/click”]){
//do something you want
return NO;
}
return YES;
}
通過截獲這個request的參數就可以做native需要做的事情。
iOS 原生與JS交互 (webkit + js)
鑒於最近項目中需要用到原生與JS交互,以前做過交互,但是沒有總結一個demo,這次做的時候都忘記了,所以這次做了一個swift 和 OC 的demo。方便以後需要用交互功能的時候查看。
由於也沒有難的點,所以這裡就不做技術上的講解了。直接上的地址: iOS webKit (swift + oc) 原生交互Demo . demo里包含了Swift 版和 OC版 ,由於UIWebView的性能相比webkit而言,相差甚遠,在加上現在的項目基本都支持8.0以上的系統,所以基本可以放棄UIWebview了。
原生APP中js怎樣與Android和ios進行交互
一、對於Android和ios我們要執行不同的操作,下面是判斷系統的js代碼
// alert(ismobile(1)); 1表示Android,0表示ios
function ismobile(test){
var u = navigator.userAgent, app = navigator.appVersion;
if(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))){
if(window.location.href.indexOf(“?mobile”)lt;0){
try{
if(/iPhone|mac|iPod|iPad/i.test(navigator.userAgent)){
return ‘0’;
}else{
return ‘1’;
}
}catch(e){}
}
}else if( u.indexOf(‘iPad’) gt; -1){
return ‘0’;
}else{
return ‘1’;
}
}
二、js調用app端函數,下面是js代碼
if(ismobile(1)==1){
Android.setTypeActivity(id,type,href);
}else{
jsToios(id,type,href);
}
setTypeActivity是Android端定義的函數,jsToios是ios端定義的函數,括弧里是js端傳遞的參數。
三、至於js端怎樣獲取app端的數據,只需在js端提供給app端函數名字,在通知app端調用即可
四、還有一種方法可以不通過app的方法將數據傳遞給另一個頁面,那就是通過URL的方式
在本頁面將數據拼接在ip後面
在另外一個頁面通過下面方法獲取URL後的參數
function GetRequest() {
var url = location.search; //獲取url中”?”符後的字串
var theRequest = new Object();
if (url.indexOf(“?”) != -1) {
var str = url.substr(1);
strs = str.split(“”);
for(var i = 0; i strs.length; i ++) {
theRequest[strs[i].split(“=”)[0]]=decodeURIComponent(strs[i].split(“=”)[1]);
}
}
return theRequest;
}
// 獲取URL參數
var Request = new Object();
Request = GetRequest();
var name;
name = Request[‘name’];
iOS中WkWebView與js交互
1、初始化wkwebview
2、獲取js返回的信息
3、原生調用js方法
4、攔截url(可在此方法中實現判斷url執行相應的oc方法):js會嘗試載入某個URL,客戶端在載入前攔截這個URL,通過解析這個URL識別它的內容,調用相應的原生方法,並阻止瀏覽器載入這個URL
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258417.html