国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

WKWebView

2019-11-09 14:10:05
字體:
供稿:網(wǎng)友

iOS8之后,蘋果推出了WebKit這個框架,用來替換原有的UIWebView,新的控件優(yōu)點(diǎn)多多,不一一敘述。由于一直在適配iOS7,就沒有去替換,現(xiàn)在仍掉了iOS7,以為很簡單的就替換過來了,然而在替換的過程中,卻遇到了很多坑。

WKWebView使用

WKWebView使用及注意點(diǎn)

WKWebView只能用代碼創(chuàng)建,而且自身就支持了右滑返回手勢allowsBackForwardNavigationGestures和加載進(jìn)度estimatedPRogress等一些UIWebView不具備卻非常好用的屬性。在創(chuàng)建的時候,指定初始化方法中要求傳入一個WKWebViewConfiguration對象,一般我們使用默認(rèn)配置就好,但是有些地方是要根據(jù)自己的情況去做更改。比如,配置中的allowsInlineMediaPlayback這個屬性,默認(rèn)為NO,如果不做更改,網(wǎng)頁中的視頻將彈出一個全屏的控制器來播放,設(shè)置為YES,將內(nèi)嵌在網(wǎng)頁中播放。

更改User-Agent

有時我們需要在User-Agent添加一些額外的信息,這時就要更改默認(rèn)的User-Agent.self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero];//獲取默認(rèn)User-Agent[self.wkWebView evaluatejavaScr需要注意的是App內(nèi)所有Web請求的User-Agent全部被修改。在iOS9,WKWebView提供了一個非常便捷的屬性去更改User-Agent,就是customUserAgent屬性。這樣使用起來不僅方便,也不會全局更改User-Agent,可惜的是iOS9才有,如果適配iOS8,還是要使用上面的方法。

WKWebView的相關(guān)的代理方法

WKWebView的相關(guān)的代理方法分別在WKNavigationDelegate和WKUIDelegate以及WKScriptMessageHandler這個與
Javascript交互相關(guān)的代理方法。 WKNavigationDelegate: 此代理方法中除了原有的UIWebView的四個代理方法,還增加了其他的一些方法,具體可參考我下面給出的Demo。 WKUIDelegate: 此代理方法在使用中最好實(shí)現(xiàn),否則遇到網(wǎng)頁alert的時候,如果此代理方法沒有實(shí)現(xiàn),則不會出現(xiàn)彈框提示。 WKScriptMessageHandler: 此代理方法就是和JavaScript交互相關(guān),具體介紹參考下面的專門講解。
一、加載網(wǎng)頁
加載網(wǎng)頁或HTML代碼的方式與UIWebView相同,代碼示例如下:WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];[self.view addSubview:webView];
二、加載的狀態(tài)回調(diào) (WKNavigationDelegate)

用來追蹤加載過程(頁面開始加載、加載完成、加載失?。┑姆椒ǎ? // 頁面開始加載時調(diào)用 -(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation; // 當(dāng)內(nèi)容開始返回時調(diào)用 -(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation; // 頁面加載完成之后調(diào)用 -(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation; // 頁面加載失敗時調(diào)用 -(void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

頁面跳轉(zhuǎn)的代理方法:

// 接收到服務(wù)器跳轉(zhuǎn)請求之后調(diào)用 -(void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation; // 在收到響應(yīng)后,決定是否跳轉(zhuǎn) -(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler; // 在發(fā)送請求之前,決定是否跳轉(zhuǎn) -(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

三、新的WKUIDelegate協(xié)議
這個協(xié)議主要用于WKWebView處理web界面的三種提示框(警告框、確認(rèn)框、輸入框),下面是警告框的例子:/** * web界面中有彈出警告框時調(diào)用 * * @param webView 實(shí)現(xiàn)該代理的webview * @param message 警告框中的內(nèi)容 * @param frame 主窗口 * @param completionHandler 警告框消失調(diào)用 */- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
四、動態(tài)加載并運(yùn)行JS代碼
用于在客戶端內(nèi)部加入JS代碼,并執(zhí)行,示例如下:// 圖片縮放的js代碼NSString *js = @"var count = document.images.length;for (var i = 0; i < count; i++) {var image = document.images[i];image.style.width=320;};window.alert('找到' + count + '張圖');";// 根據(jù)JS字符串初始化WKUserScript對象WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];// 根據(jù)生成的WKUserScript對象,初始化WKWebViewConfigurationWKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];[config.userContentController addUserScript:script];_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];[_webView loaDHTMLString:@"<head></head><imgea src='http://www.nsu.edu.cn/v/2014v3/img/background/3.jpg' />"baseURL:nil];[self.view addSubview:_webView];
五、webView 執(zhí)行JS代碼
用戶調(diào)用用JS寫過的代碼,一般指服務(wù)端開發(fā)的://javaScriptString是JS方法名,completionHandler是異步回調(diào)block[self.webView evaluateJavaScript:javaScriptString completionHandler:completionHandler];
六、JS調(diào)用App注冊過的方法
再WKWebView里面注冊供JS調(diào)用的方法,是通過WKUserContentController類下面的方法:- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;scriptMessageHandler是代理回調(diào),JS調(diào)用name方法后,OC會調(diào)用scriptMessageHandler指定的對象。

JS在調(diào)用OC注冊方法的時候要用下面的方式:

window.webkit.messageHandlers.<name>.postMessage(<messageBody>)

注意:name(方法名)是放在中間的,messageBody只能是一個對象,如果要傳多個值,需要封裝成數(shù)組,或者字典。整個示例如下:

//OC注冊供JS調(diào)用的方法[[_webView configuration].userContentController addScriptMessageHandler:self name:@"closeMe"];//OC在JS調(diào)用方法做的處理- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ NSLog(@"JS 調(diào)用了 %@ 方法,傳回參數(shù) %@",message.name,message.body);}

//JS調(diào)用 window.webkit.messageHandlers.closeMe.postMessage(null); 如果你在self的dealloc打個斷點(diǎn),會發(fā)現(xiàn)self沒有釋放!這顯然是不行的!谷歌后看到一種解決方法,如下:

@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;@end@implementation WeakScriptMessageDelegate- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate{ self = [super init]; if (self) { _scriptDelegate = scriptDelegate; } return self;}- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];}@end

思路是另外創(chuàng)建一個代理對象,然后通過代理對象回調(diào)指定的self,

WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"closeMe"];

運(yùn)行代碼,self釋放了,WeakScriptMessageDelegate卻沒有釋放啊啊??! 還需在self的dealloc里面 添加這樣一句代碼:

[[_webView configuration].userContentController removeScriptMessageHandlerForName:@"closeMe"];
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南京市| 兰西县| 郓城县| 宿松县| 建阳市| 满洲里市| 台东市| 商南县| 邹城市| 郓城县| 两当县| 慈溪市| 安义县| 原阳县| 成武县| 章丘市| 河东区| 梓潼县| 泗阳县| 南皮县| 女性| 胶南市| 乐东| 阳春市| 文成县| 南充市| 丰镇市| 孝感市| 巴南区| 清流县| 宁乡县| 黑水县| 梓潼县| 监利县| 昂仁县| 隆子县| 司法| 海门市| 南投市| 平乡县| 泰兴市|