IOS中UIWebView、WKWebView之JS交互
做客戶端開發(fā),肯定避免不了JS交互,于是自己對蘋果接口做了個簡易封裝:
JSExport-->UIWebView+Interaction、WKScriptMessageHandler -->WKWebView+Interaction以備以后使用。
代碼非常簡潔,見這里:https://github.com/V5zhou/JSInteraction.git
舊方式
舊的交互方式有通過UIWebViewDelegate實現(xiàn)的:JS與客戶端定義好跳轉(zhuǎn)頁面參數(shù),在將要跳轉(zhuǎn)時捕獲關(guān)鍵字,然后處理業(yè)務(wù)。
iOS端:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *urlString = [[request URL] absoluteString]; if ([urlString isEqualToString:@"objc://loading"]) { if (_gotoRootViewController) { _gotoRootViewController(); } } return YES; }
JS端:
<!DOCTYPE html> <html> <title>test</title> <meta charset="utf-8"> <body> <a href="javascript:document.location = 'objc://loading'" rel="external nofollow" class="btn">這是交互按鈕</a> </body> </html>
UIWebView+JSExport方式
導(dǎo)入JavaScriptCore.framework,并導(dǎo)入我的擴展類#import "UIWebView+Interaction.h"。
使用方式
OC調(diào)JS:
[_webView InterActionToJs:@"alertMobile('15625298071')"];
JS調(diào)OC:
- (void)webViewDidFinishLoad:(UIWebView *)webView { [self.webView InterActionToOc:^(InterActionOcType functionType, NSDictionary *param) { switch (functionType) { case InterActionOcType_alert: { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:param[@"title"] message:param[@"content"] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"確定", nil]; [alert show]; } break; case InterActionOcType_present: { self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; Class Cls = NSClassFromString(param[@"toController"]); BOOL isAnimate = [param[@"animate"] boolValue]; UIViewController *ctl = [[Cls alloc] init]; [self presentViewController:ctl animated:isAnimate completion:nil]; } break; default: break; } }]; }
添加動作
//自定義添加功能類型 typedef NS_ENUM(NSUInteger, InterActionOcType) { InterActionOcType_alert = 0, InterActionOcType_present, InterActionOcType_xxxxxxx, //有啥需求就和這里添加 };
并且對應(yīng)的html中添加JS,參數(shù)封裝為字典形式。例:
function myPresent(ctl) { var param = new Array(); param["animate"] = 1; param["toController"] = "SecondViewController"; WebViewInteraction.callBack(1, param); }
其中callBack是通過這個JSExport實現(xiàn)的
@protocol WebViewJSExport <JSExport> JSExportAs (callBack /** callBack 作為js方法的別名 */, - (void)awakeOC:(InterActionOcType)type param:(NSDictionary *)param ); @end
WKWebView+WKScriptMessageHandler方式
導(dǎo)入WebKit.framework,并導(dǎo)入我的擴展類#import "WKWebView+Interaction.h"。
使用方式
OC調(diào)JS:
[self.wkWebView InterActionToJs:@"JSReloadTitle('你點了刷新JS按鈕,我沒猜錯!')"];
JS調(diào)OC:
//注冊交互類型 [self.wkWebView registerScriptTypes:@{@"OCDismiss" : @(WKInterActionOcType_dismiss), @"OCShowAlert" : @(WKInterActionOcType_alert)}]; [self.wkWebView InterActionToOc:^(WKInterActionOcType functionType, NSDictionary *param) { switch (functionType) { case WKInterActionOcType_dismiss: { BOOL isAnimate = [param[@"animate"] boolValue]; [self dismissViewControllerAnimated:isAnimate completion:nil]; } break; case WKInterActionOcType_alert: { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"JS去做平方" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil]; alert.alertViewStyle = UIAlertViewStylePlainTextInput; [alert show]; } break; default: break; } }];
添加動作
//自定義添加功能類型 typedef NS_ENUM(NSUInteger, WKInterActionOcType) { WKInterActionOcType_alert = 0, WKInterActionOcType_dismiss, WKInterActionOcType_xxxxxxx, //有啥需求就和這里添加 };
并且對應(yīng)的html中添加JS,參數(shù)封裝為字典形式。例:
//js調(diào)oc function myDismiss() { window.webkit.messageHandlers.OCDismiss.postMessage({"animate" : 1}); //這里的OCDismiss對應(yīng)注冊類型 }
其中callBack是通過WKScriptMessageHandler實現(xiàn)的
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { dispatch_async(dispatch_get_main_queue(), ^{ NSString *name = message.name; NSDictionary *value = message.body; WKInterActionOcType type = [self.typeDict[name] integerValue]; if (self.block) { self.block(type, value); } }); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS tableView實現(xiàn)頭部拉伸并改變導(dǎo)航條漸變色
這篇文章主要為大家詳細介紹了iOS tableView實現(xiàn)頭部拉伸并改變導(dǎo)航條漸變色,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05iOS ScrollView嵌套tableView聯(lián)動滾動的思路與最佳實踐
這篇文章主要給大家介紹了關(guān)于ScrollView嵌套tableView聯(lián)動滾動的思路與最佳實踐,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用
這篇文章主要為大家詳細介紹了iOS微信分享后關(guān)閉發(fā)送成功提示并返回應(yīng)用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09IOS 聊天界面(自適應(yīng)文字)的實現(xiàn)
本文主要介紹一個實現(xiàn)聊天界面的思路過程,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03iOS中UIScrollView嵌套UITableView的實踐教程
在UIScrollView嵌套UITableView的問題相信大家都遇到過,小編最近在工作中就遇到了這個問題,所以這篇文章主要介紹了iOS中UIScrollView嵌套UITableView的相關(guān)資料,文中介紹的方法是通過自己的實踐所得來的,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05