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

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

UIWebView、WKWebView與js的交互

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

最近項目里用到了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 = @"http://www.baidu.com"; 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
亚洲电影在线观看| www.日韩不卡电影av| 久久五月天色综合| 欧美激情极品视频| 在线丨暗呦小u女国产精品| 亚洲91av视频| 中文字幕亚洲激情| 91中文字幕在线| 欧美精品video| 少妇激情综合网| 久久久噜噜噜久久久| 国产精品青草久久久久福利99| 欧美日韩在线影院| 久久97久久97精品免视看| 日韩欧美在线视频| 国产精品日韩欧美综合| 亚洲剧情一区二区| 日韩精品一区二区三区第95| 国产精品女主播视频| 亚洲精品小视频在线观看| 亚洲国产精品电影| 这里只有精品在线播放| 91成人在线视频| 精品调教chinesegay| 中文一区二区视频| 国产精品扒开腿做爽爽爽视频| 国产成人精品久久二区二区| 色综合久久中文字幕综合网小说| 欧美一级在线亚洲天堂| 亚洲欧美国产精品| 中文字幕日韩精品在线观看| 国产+人+亚洲| 中文字幕亚洲无线码在线一区| 中文字幕av一区中文字幕天堂| 亚洲精品99久久久久中文字幕| 亚洲激情自拍图| 97超级碰碰碰| 久久久久久av| 亚洲电影第1页| 成人免费黄色网| 日韩综合视频在线观看| 色综合91久久精品中文字幕| 久久中文字幕视频| 国产精欧美一区二区三区| 亚洲bt天天射| 亚洲欧美日韩一区二区在线| 色偷偷888欧美精品久久久| 亚洲自拍偷拍第一页| 亚洲大胆人体视频| 91在线观看免费高清完整版在线观看| 欧美激情一区二区三区在线视频观看| 26uuu日韩精品一区二区| 日韩免费在线电影| 日本91av在线播放| 亚洲在线www| 国内外成人免费激情在线视频网站| 97色在线观看免费视频| 久久久97精品| 国产亚洲精品久久久久久777| 亚洲人高潮女人毛茸茸| www.亚洲免费视频| 欧洲美女7788成人免费视频| 成人免费午夜电影| 91午夜理伦私人影院| 欧美成人在线免费| 中文字幕在线视频日韩| 亚洲国产精久久久久久| 亚洲一区二区在线播放| 日韩成人av在线播放| 亚洲人线精品午夜| 日韩中文在线中文网三级| 日韩在线欧美在线国产在线| 国产精品wwww| 91精品综合久久久久久五月天| 亚洲第一区第一页| 久久九九免费视频| 日日噜噜噜夜夜爽亚洲精品| 国产视频久久久| 国产精品7m视频| 久久在精品线影院精品国产| 欧美另类在线观看| 欧美黄色片视频| 久久综合伊人77777蜜臀| 午夜精品一区二区三区在线视频| 亚洲护士老师的毛茸茸最新章节| 91视频国产一区| 欧美性xxxx极品高清hd直播| 国产主播精品在线| 在线视频亚洲欧美| 国产精品99久久久久久人| 国产日韩换脸av一区在线观看| 国模吧一区二区| 98精品国产高清在线xxxx天堂| 97成人精品区在线播放| 日韩在线免费视频观看| 欧美老女人xx| 亚洲视频在线免费看| 伊人久久综合97精品| 九九热这里只有在线精品视| 成人高清视频观看www| 亚洲精品98久久久久久中文字幕| 日韩精品免费在线视频观看| 欧美在线国产精品| 中文字幕久久亚洲| 国产精品久久久久一区二区| 日韩成人高清在线| 欧美日韩免费网站| 91av在线播放视频| 国产亚洲激情在线| 亚洲91精品在线观看| 国产精品高潮在线| www.亚洲一区| 成人免费大片黄在线播放| 欧美日韩精品在线观看| 亚洲第一精品夜夜躁人人躁| 亚洲人成电影网站色www| 日韩少妇与小伙激情| 亚洲精品久久在线| 欧美在线性视频| 午夜精品视频在线| 亚洲人精品午夜在线观看| 性金发美女69hd大尺寸| 国产精品成人品| 亚洲视频999| 亚洲成av人乱码色午夜| 成人久久一区二区| 亚洲黄一区二区| 日韩在线视频二区| 亚洲精品久久久久中文字幕二区| 国产不卡一区二区在线播放| 国产精品网红福利| 亚洲a一级视频| 国产精品揄拍500视频| 91成人免费观看网站| 日韩在线观看免费全集电视剧网站| 亚洲国产成人久久综合一区| 欧美人与物videos| 亚洲韩国欧洲国产日产av| 日韩精品视频免费专区在线播放| 欧美久久精品午夜青青大伊人| 国产欧美精品久久久| 久久97久久97精品免视看| 丝袜情趣国产精品| 亚洲无限av看| 91网在线免费观看| 欧美在线观看网站| 黄色91在线观看| 欧美午夜丰满在线18影院| 国产精品电影网站| 92看片淫黄大片看国产片| 亚洲影视中文字幕| 欧美性视频在线| 日韩高清电影好看的电视剧电影| 国产精品色视频| 亚洲999一在线观看www| 国产午夜精品全部视频播放| 91精品视频免费观看| 亚洲人午夜精品| 国产精品久久久久久久久免费看| 91精品美女在线| 国产91亚洲精品| 国产成人a亚洲精品| 国产日韩精品在线| 91精品久久久久久久久久久久久|