交互辦法:
方案一.使用系統(tǒng)的最原生的交互:
(1)js 調(diào)用原生的方法:
思路:網(wǎng)頁的每次請求都是一次request ,在webView中有一個代理方法- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType嚷狞;可以攔截請求的東西芭届。
本人對js了解不太深所以js代碼就不貼了。算了還是找到了貼一下感耙,
#pragma mark ****這部分代碼是html中的 js代碼
var btn = document.getElementById('upload'); // 獲取叫upload的按鈕
var nativeBridage = { // 這個應(yīng)該是和webView的橋梁吧褂乍,不太懂的樣子。
invoke: function (commandName) {
console.log(commandName);
window.location = 'js-call:' + commandName ;// 這js-call 是我們能夠截獲到的事件嗯即硼,就是他了逃片。
}
};
btn.addEventListener("click", function() {// 這個是為按鈕增加綁定點擊事件
console.log("Cliked");// 打印。只酥。褥实。
if (window.android) { // 這個是安卓的方法,安卓的方法好像能直接調(diào)用裂允,好厲害的樣子
console.log("Has Android");
android.test();
} else {// 這個代碼就是我們iOS的了损离,不是安卓就是iOS,你把winPhone放哪了绝编?別問我也不知道僻澎。
nativeBridage.invoke('test');
}
});
#pragma mark ****這部分代碼是我們OC中的代碼了
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
//獲取他的請求路徑
NSString *requestURLString = [[request URL] absoluteString];
// ?判斷是否有這個js-call
if ([requestURLString hasPrefix:@"js-call:"]) {
//? 接下來是判斷command的名字和JSON參數(shù)字符串:
#warning js-call 后面是個數(shù)組,
NSArray *components = [requestURLString componentsSeparatedByString:@":"];
//? 命令名字
NSString *commandName = (NSString*)[components objectAtIndex:0];
NSLog(@"components %@ %@ ",components,commandName); // 打印看看
if([commandName isEqualToString:@"test"]){ // 判斷名字是什么執(zhí)行相應(yīng)的操作
NSLog(@"做任何你想做的事情(使用self的時候用weakSelf比較好十饥,據(jù)說是因為js會強(qiáng)引用oc的東西窟勃。)");
return NO;// 最好返回NO,不然會出現(xiàn)一些奇怪的事情逗堵。
}
}
return YES;
}
(2)oc調(diào)用js?
這個就沒什么好寫的了秉氧,
做網(wǎng)頁的會給你一個js函數(shù)名func,直接使用下面的方法就可以了
[self.webView stringByEvaluatingJavaScriptFromString:func];
例如本人遇到的是傳參的函數(shù)
她給我的函數(shù)名是:window.myApp.services.cameraHandler(error,string);// 沒錯蜒秤,他給我的就是這個汁咏,通常不是什么test()亚斋;之類的么。
然后就拼接一下就行了攘滩,對了這個是要傳參數(shù)的
第一個參數(shù)顧名思義是錯誤帅刊,開玩笑,我怎么會有錯誤轰驳,不傳厚掷,(注意可以不傳,他們那邊就是null级解,你要是穿個null 或者nil 冒黑,他們那邊不是null,我也不懂是不是這樣勤哗,但是我做的時候就是這樣奥盏!)
第二個參數(shù)是要傳一些值:就傳一個字符串吧@“silly boy芒划!”
NSString *pathStr =@“silly boy冬竟!”;
//將參數(shù)拼接到j(luò)s函數(shù)中
NSString *path = [NSString stringWithFormat:@"window.myApp.services.cameraHandler('','%@');",pathStr];
// 執(zhí)行js代碼
[self.webView stringByEvaluatingJavaScriptFromString:path];
End
二。使用第三方WebViewJavascriptBridge
(https://github.com/marcuswestin/WebViewJavascriptBridge)
第三方的還是自己研究吧民逼,我就不多寫了泵殴。(好吧我承認(rèn)我是沒用過)
*在iOS / OSX的橋梁,為在UIWebViews / WebViews的OBJ-C與JavaScript之間發(fā)送消息**很多人在用(哇咔咔)拼苍,本人項目小用原生的就行了笑诅。
三。iOS7里的JavaScriptCore framework
使用這個疮鲫,還是自行百度吧吆你,網(wǎng)上一大堆代碼】》福可以參考這個:http://justsee.iteye.com/blog/2036713
四妇多。iOS8WKWebView
給個鏈接自己看吧,有好的告訴我燕侠,我也看看者祖。
https://lvwenhan.com/ios/460.html
本人是菜鳥,如有錯誤請指正贬循,歡迎交流咸包。