動(dòng)態(tài)的通過webView加載html文件膀篮,這樣就可以實(shí)時(shí)更新Html的內(nèi)容,給用戶更好的體驗(yàn)效果谨湘。iOS早期的中绽快,主要是通過UIWebView來實(shí)現(xiàn)這個(gè)功能,好紧阔,告訴你坊罢,iOS8以后,有了一個(gè)WKWebView擅耽,用它活孩,用它,用它乖仇。性能憾儒、內(nèi)存絕對(duì)是一個(gè)很大的優(yōu)化的體驗(yàn)询兴。本文,從兩個(gè)角度講述起趾,WKWebView的使用诗舰。##使用原聲代碼實(shí)現(xiàn)WKWebView使用稍等、待續(xù)##使用絕壁的第三方來實(shí)現(xiàn)WKWebView使用WebViewJavascriptBridge的作者也做了一套支持WKWebView與JS交互的第三方框架:训裆。(WKWebViewJavascriptBridge)>cocoaPods: pod ‘WebViewJavascriptBridge’, ‘~> 5.0.5’>github地址:https://github.com/marcuswestin/WebViewJavascriptBridge安裝上眶根,我們開始玩耍!注意:先將我們提前寫好的HTML放到服務(wù)上边琉,為了模擬的更逼真點(diǎn)属百,這里采用XAMPP開了服務(wù),放進(jìn)去HTML代碼
NSAppTransportSecurityNSAllowsArbitraryLoads
2族扰、要引入#import// 使用WKwebview要導(dǎo)入此文件
3、WKWebViewJavascriptBridge包含了UIWebView跟WKWebView定欧。因此要注意導(dǎo)入的頭文件JS調(diào)用Objective1渔呵、data js傳遞給原生的參數(shù)2、responseCallback 原生回調(diào)js的方法 [_bridge registerHandler:@"Login" handler:^(id data, WVJBResponseCallback responseCallback) { NSLog(@"JS called Objective,objectie get js param: %@", data); // 寫登錄邏輯判斷 NSDictionary * returnData = @{@"data":@"登錄成功"}; responseCallback(returnData); }];
###完整的Objective代碼```#import "ViewController.h"#import// 使用WKwebview要導(dǎo)入此文件#import@interface ViewController ()@property (weak, nonatomic) IBOutlet UILabel *lblLog;
@property (weak, nonatomic) IBOutlet UIButton *buttonCallBack;
@property WKWebViewJavascriptBridge* bridge;
@end
@implementation ViewController
- (IBAction)ocCallJS:(id)sender {
id data = @{@"data": @"oc調(diào)js啦"};
[self.bridge callHandler:@"callJS" data:data responseCallback:^(id response) {
NSLog(@"js返回了: %@", response);
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame];
webView.backgroundColor = [UIColor clearColor];
webView.userInteractionEnabled = YES;
webView.navigationDelegate = self;
[WKWebViewJavascriptBridge enableLogging];// 開啟日志
_bridge = [WKWebViewJavascriptBridge bridgeForWebView:webView];
[_bridge setWebViewDelegate:self];
[_bridge registerHandler:@"getJson" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"JS called Objective,objectie get js param: %@", data);
NSDictionary * returnData = @{@"data":@"objective return js param is hello world"};
responseCallback(returnData);
}];
[_bridge registerHandler:@"Login" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"JS called Objective,objectie get js param: %@", data);
// 寫登錄邏輯判斷
NSDictionary * returnData = @{@"data":@"登錄成功"};
responseCallback(returnData);
}];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.1.221/web/IOSTest/test.html"]]];// 注意html文件的路徑
[self.view addSubview:webView];
[self.view bringSubviewToFront:self.lblLog];
[self.view bringSubviewToFront:self.buttonCallBack];
}
@end
Objective調(diào)用JS
1砍鸠、參數(shù)1.調(diào)用js給我準(zhǔn)備好的方法
2厘肮、參數(shù)2,原生傳遞給js的參數(shù)
3睦番、參數(shù)3、js回調(diào)給原生的方法
id data = @{@"data": @"oc調(diào)js啦"};
[self.bridge callHandler:@"callJS" data:data responseCallback:^(id response) {
NSLog(@"js返回了: %@", response);
}];
##HTML代碼
算了耍属,html代碼比較多托嚣,還是上傳到git上面去。
##代碼在這里厚骗!這里示启!這里!
[代碼](https://git.oschina.net/freedom_coco/ObjectiveCallJs.git)
https://git.oschina.net/freedom_coco/ObjectiveCallJs.git
##注意事項(xiàng)
1领舰、如果Xcode控制臺(tái)有打印夫嗓,而頁面沒有反應(yīng),那么就是頁面這邊報(bào)錯(cuò)了冲秽。通過瀏覽器訪問下舍咖,就可以定位到問題
2、如果點(diǎn)擊都xcode日志也沒有打印锉桑,頁面也沒有變化排霉,那么一般都是bridge沒有成功,失敗了民轴。原生出問題了攻柠。