亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

UIWebView、WKWebView與js的交互

2019-11-09 14:27:12
字體:
來源:轉載
供稿:網友

最近項目里用到了web界面與js交互,項目使用的是UIWebView,但是會出現數據丟失的情況比較麻煩,使用WKWebView可以避免這種情況,下面就寫一些web的基本使用,可能有些使用不當的地方,請指教。 * UIWebView 創建一個類文件,可以定義交互時的函數名,然后定義一個代理,在web界面調用進行相應的操作。 “` //類的.h文件 # import

//類的.m文件 #import "KQJSModel.h"#import "KQPayTypeViewController.h"@implementation KQJSModel-(void)startPay:(int)amount Action:(NSString *)action Teamid:(NSString *)teamid{ NSLog(@"--------amount:%d---------action:%@------teamid:%@",amount,action,teamid); if (self.delegate && [self.delegate respondsToSelector:@selector(goToPayVC:action:teamid:)]) { [self.delegate goToPayVC:amount action:[NSString stringWithFormat:@"%@",action] teamid:[NSString stringWithFormat:@"%@",teamid]]; }}@end//web界面,在代理方法里注入方法名,-(void)webViewDidStartLoad:(UIWebView *)webView{ //首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext) JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScrJavascriptFromString:@"document.title"];; NSLog(@"-----網頁標題---%@",htmlTitle); self.title = [NSString stringWithFormat:@"%@",htmlTitle]; //首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext) JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //第二種情況,js是通過對象調用的,我們假設js里面有一個對象 testobject 在調用方法 //首先創建我們新建類的對象,將他賦值給js的對象 KQJSModel *testJO=[[KQJSModel alloc] init]; testJO.delegate = self; //類的協議代理 context[@"IOSApp"]=testJO;}//再調用KQJSModel類的代理方法,在代理方法里實現想要的進行的操作。#PRagma mark -- KQJSModelDelegate-(void)goToPayVC:(int)amount action:(NSString *)action teamid:(NSString *)teamid{//進行界面跳轉,刷新,一定要在主線程里,不然會崩潰 dispatch_async(dispatch_get_main_queue(), ^{ KQPayTypeViewController *pay = [[KQPayTypeViewController alloc] init]; pay.money = [NSString stringWithFormat:@"%d",amount]; pay.action = [NSString stringWithFormat:@"%@",action]; pay.teamid = [NSString stringWithFormat:@"%@",teamid]; if (![action isEqualToString:@""] && action != nil) { pay.vip = @"vip"; } KQCommonNavController *nav = [[KQCommonNavController alloc]initWithRootViewController:pay]; [self presentViewController:nav animated:YES completion:nil]; });}

以上就是UIWebView與js的交互,運行就可以進行相應的操作了。

WKWebView 最近才看了WKWebView的使用,就感覺比UIWebView流暢寫,然后自帶的導航進度條,這個感覺很方便,下面是與js的簡單的交互,有不正確的,請留言,謝謝~ #import "ViewController.h"#import <WebKit/WebKit.h>#define kScreenWidth [UIScreen mainScreen].bounds.size.width#define kScreenHeight [UIScreen mainScreen].bounds.size.height@interface ViewController ()<WKUIDelegate,WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler>@property (nonatomic, strong) WKWebView *wkWebView;@property (nonatomic, strong) WKWebViewConfiguration *wkConfig;/* *1.添加UIProgressView屬性 */@property (nonatomic, strong) UIProgressView *progressView;@end@implementation ViewController#pragma mark - 初始化wkWebView- (WKWebViewConfiguration *)wkConfig { if (!_wkConfig) { _wkConfig = [[WKWebViewConfiguration alloc] init]; _wkConfig.allowsInlineMediaPlayback = YES; _wkConfig.allowsPictureInPictureMediaPlayback = YES; _wkConfig.processPool = [[WKProcessPool alloc] init]; [_wkConfig.userContentController addScriptMessageHandler:self name:@"AppModel"]; //注入的js函數名, } return _wkConfig;}- (WKWebView *)wkWebView { if (!_wkWebView) { _wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight) configuration:self.wkConfig]; // 導航代理 _wkWebView.navigationDelegate = self; // 與webview UI交互代理 _wkWebView.UIDelegate = self; [self.view addSubview:_wkWebView]; } return _wkWebView;}/* *6.在dealloc中取消監聽 */- (void)dealloc { [self.wkWebView removeObserver:self forKeyPath:@"estimatedProgress"];}- (void)viewDidLoad { [super viewDidLoad]; [self startLoad]; /* *2.初始化progressView */ self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 64, [[UIScreen mainScreen] bounds].size.width, 2)]; self.progressView.backgroundColor = [UIColor blueColor]; //設置進度條的高度,下面這句代碼表示進度條的寬度變為原來的1倍,高度變為原來的1.5倍. self.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.5f); [self.view addSubview:self.progressView]; /* *3.添加KVO,WKWebView有一個屬性estimatedProgress,就是當前網頁加載的進度,所以監聽這個屬性。 */ [self.wkWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil]; UIButton *bavkBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 16, 20)]; [bavkBtn setImage:[UIImage imageNamed:@"navback"] forState:UIControlStateNormal]; [bavkBtn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithCustomView:bavkBtn]; self.navigationItem.leftBarButtonItem = left;}- (void)back{ if ([self.wkWebView canGoBack]) { [self.wkWebView goBack]; }}#pragma mark - start load web- (void)startLoad { NSString *urlString = @"https://testh5.keqiong.net/app/my-kqcoin.html?type=Driver"; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]]; request.timeoutInterval = 15.0f; [self.wkWebView loadRequest:request];}#pragma mark - 監聽/* *4.在監聽方法中獲取網頁加載的進度,并將進度賦給progressView.progress */- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if ([keyPath isEqualToString:@"estimatedProgress"]) { self.progressView.progress = self.wkWebView.estimatedProgress; if (self.progressView.progress == 1) { /* *添加一個簡單的動畫,將progressView的Height變為1.4倍 *動畫時長0.25s,延時0.3s后開始動畫 *動畫結束后將progressView隱藏 */ __weak typeof (self)weakSelf = self; [UIView animateWithDuration:0.25f delay:0.3f options:UIViewAnimationOptionCurveEaSEOut animations:^{ weakSelf.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.4f); } completion:^(BOOL finished) { weakSelf.progressView.hidden = YES; }]; } }else{ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; }}#pragma mark - WKWKNavigationDelegate Methods/* *5.在WKWebViewd的代理中展示進度條,加載完成后隱藏進度條 *///開始加載- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { NSLog(@"開始加載網頁"); //開始加載網頁時展示出progressView self.progressView.hidden = NO; //開始加載網頁的時候將progressView的Height恢復為1.5倍 self.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.5f); //防止progressView被網頁擋住 [self.view bringSubviewToFront:self.progressView];}//加載完成- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { NSLog(@"加載完成");}//加載失敗- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error { NSLog(@"加載失敗"); //加載失敗同樣需要隱藏progressView self.progressView.hidden = YES;}//頁面跳轉- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { //允許頁面跳轉 NSLog(@"%@",navigationAction.request.URL); decisionHandler(WKNavigationActionPolicyAllow);}#pragma mark - WKUIDelegate- (void)webViewDidClose:(WKWebView *)webView { NSLog(@"%s", __FUNCTION__);}// 在JS端調用alert函數時,會觸發此代理方法。// JS端調用alert時所傳的數據可以通過message拿到// 在原生得到結果后,需要回調JS,是通過completionHandler回調- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { NSLog(@"%s", __FUNCTION__); UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"alert" message:@"JS調用alert" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(); }]]; [self presentViewController:alert animated:YES completion:NULL]; NSLog(@"%@", message);}// JS端調用confirm函數時,會觸發此方法// 通過message可以拿到JS端所傳的數據// 在iOS端顯示原生alert得到YES/NO后// 通過completionHandler回調給JS端- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler { NSLog(@"%s", __FUNCTION__); UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"confirm" message:@"JS調用confirm" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(YES); }]]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { completionHandler(NO); }]]; [self presentViewController:alert animated:YES completion:NULL]; NSLog(@"%@", message);}// JS端調用prompt函數時,會觸發此方法// 要求輸入一段文本// 在原生輸入得到文本內容后,通過completionHandler回調給JS- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler { NSLog(@"%s", __FUNCTION__); NSLog(@"%@", prompt); UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"textinput" message:@"JS調用輸入框" preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.textColor = [UIColor redColor]; }]; [alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler([[alert.textFields lastObject] text]); }]]; [self presentViewController:alert animated:YES completion:NULL];}- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲电影天堂| 久久久久久久久爱| 日韩av电影院| 亚洲精品美女视频| 久久中文精品视频| 77777少妇光屁股久久一区| 欧美午夜激情小视频| 国产精品久久久久久久7电影| 成人免费网站在线观看| 国产中文日韩欧美| 成人国产精品色哟哟| 亚洲色图美腿丝袜| 92福利视频午夜1000合集在线观看| 色天天综合狠狠色| 久久成年人免费电影| 正在播放欧美视频| 国产精品久久久久91| 国产欧美一区二区三区视频| 欧美xxxx18性欧美| 久久免费少妇高潮久久精品99| www.亚洲成人| 韩国精品美女www爽爽爽视频| 久久精品视频网站| 亚洲欧美国产一本综合首页| 中文字幕在线观看日韩| 亚洲国产天堂久久综合网| 精品亚洲一区二区三区四区五区| 欧美激情精品久久久久久久变态| 日韩在线播放视频| 中文字幕亚洲自拍| 97精品在线观看| 搡老女人一区二区三区视频tv| 成人网欧美在线视频| 2019中文字幕全在线观看| 亚洲精品999| 国产偷国产偷亚洲清高网站| 午夜精品99久久免费| 亚洲乱码一区av黑人高潮| 成人激情视频在线| 亚洲精品videossex少妇| 日韩美女视频免费看| 国产成人av在线播放| 国产精品高潮在线| 欧美日韩亚洲系列| 91精品久久久久久久久久久久久久| 亚洲福利精品在线| 欧美激情国内偷拍| 成人国产在线视频| 欧美成人中文字幕| 日韩电视剧免费观看网站| 狠狠干狠狠久久| 主播福利视频一区| 欧美色道久久88综合亚洲精品| 日韩精品在线免费播放| 欧美日韩国产中文精品字幕自在自线| 欧美午夜片在线免费观看| 一个人看的www久久| 久久99国产综合精品女同| 国产精品视频一区国模私拍| 欧美国产中文字幕| 精品毛片三在线观看| 亚洲欧美一区二区三区情侣bbw| 亚洲精品理论电影| 欧美成人激情视频免费观看| 国产手机视频精品| 国产精品免费视频久久久| 久久久精品免费视频| 亚洲欧美日韩视频一区| 日韩欧美中文免费| 国产一区二区在线免费视频| 91麻豆桃色免费看| xvideos国产精品| 亚洲国产91精品在线观看| 亚洲福利在线看| 亚洲影影院av| 狠狠色香婷婷久久亚洲精品| 人妖精品videosex性欧美| 欧美极品在线播放| 欧美日韩ab片| 国产精品久久久久久久久久99| 97精品国产97久久久久久免费| 国产黑人绿帽在线第一区| xxx欧美精品| 亚洲综合第一页| 奇米四色中文综合久久| 欧美精品在线观看91| 热99精品里视频精品| 国产成人97精品免费看片| 一区二区三区回区在观看免费视频| 久久视频在线播放| 亚洲美女免费精品视频在线观看| 茄子视频成人在线| 国产91成人在在线播放| 久久香蕉国产线看观看av| 欧美整片在线观看| 欧美性极品xxxx娇小| 久久久国产精品免费| 欧美日韩国产999| 亚洲精品白浆高清久久久久久| 国产精品视频色| 欧美亚洲国产日本| 欧美丰满老妇厨房牲生活| 91老司机精品视频| 久久久这里只有精品视频| 国产精品福利久久久| 国产精品人人做人人爽| 黄色成人在线免费| 国产一区二区三区日韩欧美| 一区二区欧美日韩视频| 57pao国产精品一区| 欧美激情精品久久久久久免费印度| 国产亚洲精品久久久久久| 国产精品久久在线观看| 中文字幕在线精品| 国产欧美日韩综合精品| 2020国产精品视频| 欧美电影免费观看大全| 欧美夜福利tv在线| 国产成人av网址| 日本91av在线播放| 亚洲欧美日韩精品久久亚洲区| 欧美午夜性色大片在线观看| 美日韩丰满少妇在线观看| 国产成人精品在线视频| 日本三级韩国三级久久| 91性高湖久久久久久久久_久久99| 国产91精品在线播放| 亚洲社区在线观看| 亚洲第一网中文字幕| 日本在线观看天堂男亚洲| 欧美日韩一区二区免费视频| 狠狠躁18三区二区一区| 成人性生交大片免费看小说| 日韩的一区二区| 欧美亚洲成人精品| 精品久久久中文| 午夜免费久久久久| 97在线视频免费| 91麻豆国产语对白在线观看| 性色av香蕉一区二区| 福利视频一区二区| 岛国av在线不卡| 成人激情春色网| 国产精品高潮在线| 在线观看国产精品91| 国产成人亚洲综合| 欧美精品www| 中文字幕免费精品一区高清| 成人免费视频网| 国产欧美在线播放| 日韩精品在线观看一区二区| 亚洲国产美女久久久久| 北条麻妃一区二区在线观看| 欧美中文字幕在线播放| 69av成年福利视频| 欧美福利视频在线观看| 国产高清在线不卡| 久久精品中文字幕一区| 亚洲精品久久久久久久久| 亚洲精品大尺度| 久久久久久69| 中文字幕一区二区精品| 97视频在线观看视频免费视频| 亚洲最大激情中文字幕|