一轉眼又是大半年過去了,除了上架了一款新應用外,也沒什麼進步。因此最近琢磨着搞點事情,否則我那本Java教程都快看完了。html
作爲一名iOS高(la)階(ji)法師,幾乎全部的任務裏,都會出現web這個從工會分配來的小(diao)助(che)手(wei)。這個助手身輕體盈易推倒,咳咳,易上手,能夠簡單快捷的幫助我完成任務,而且在我提交任務後,還能夠隨時修改個人任務內容,讓我不得不對這個web重視起來。web
可是呢,小助手的缺點也是很明顯的,遲鈍。數組
有次我要喝水,本能夠用隔空取物瞬間拿到水,可是爲了照顧一下工會的意思,就讓助手去取,結果它慢吞吞磨磨唧唧半天才響應我。服務器
身爲一個以快著名、以天下體驗惟快不破爲座右銘的我,怎麼能忍受這麼慢的助手,因而就回公會要求他們撤回web助手。網絡
結果固然是顯而易見的。async
理由是,個人小助手能夠隨時修改任務內容,能夠把任務裏的水改爲酒,甚至改爲毒藥,雖然指揮起來慢,可是能夠騙過NPC。我可作不到,每次交任務時都要接受NPC的搜身,脫光光被看。ide
如今每次出任務,都會帶上小助手,因此咱們的配合愈來愈默契,爲了方便交流,我也看了看《web寵物交流手冊》,以爲其實挺簡單的,就是把我本身的意思,經過一款鏈接器轉換成寵物能看得懂的意思,它就能乖乖的去作事情。等等,爲何web小助手忽然變成了寵物。工具
這個所謂的鏈接器,已經推出了二代產品,看來還挺暢銷的。我從交流手冊上選幾段說明下寵物是怎麼用的。post
第一章 第二節 -- "產品說明"性能
本產品名爲 ‘WKWebView’ 是使用web必備的工具,上一代產品爲‘UIWebView’,新產品有如下優勢:
·擁有更快的加載速度和性能,更低的內存佔用。
·重構了委託協議,能夠進行更精細化的管理和配置。
·支持更多的HTML5特性。(小助手寵物已經升級到第五代啦)
第一章 第五節 -- "召喚"
這一節主要介紹怎麼利用WKWebView召喚寵物。如下咒語中,已包含和JS的配置,有作特殊說明。
1 //初始化 webview 的設置。 2 WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; 3 4 //提供使用 JavaScript post 信息和注射 script 的方法。 5 WKUserContentController *userContentController = [[WKUserContentController alloc] init]; 6 7 configuration.userContentController = self.userContentController; 8 9 WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
就這麼簡單的幾句咒語,就能夠召喚屬於本身的寵物小助手了,不過呢,咱們但願它更增強大點,擁有更好的技能,那就繼續唸咒語。
1 //設置委託,按需設置 2 webView.navigationDelegate = self; 3 webView.UIDelegate = self; 4 5 //添加 加載進度,利用KVO 6 UIProgressView *progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 1)]; 7 8 //WK 有提供進度屬性:estimatedProgress,監聽方法就不累述了 9 [webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil]; 10 11 [self.view addSubview:webView]; 12 [self.view addSubview:progressView];
第二章 第二節 -- "寵物語正向解析"
若是各位大俠只是簡單的把寵物召喚出來溜溜彎看看風景,就不須要增長如下咒語。這一節教學主要講如何聽懂寵物的語言,好比戰鬥時,寵物說‘進攻’,你聽不懂還傻乎乎的站在原地可不行。確保能協同做戰,相互照應。則須要這要的咒語:
1 //添加要處理的JS方法 2 userContentController addScriptMessageHandler:self name:@"fire"]; 3 4 //遵照協議 並實現委託方法 5 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message 6 { 7 if ([@"fire" isEqualToString:message.name]) 8 { 9 //TODO 10 } 11 }
首先須要約定好方法名,戰鬥以前要和寵物講,要讓我進攻,就發出「&*……*&%&……(fire)」的慘叫,我就知道怎麼作了。若是不按約定的套路叫,我就聽不懂,不知道該作什麼。不管添加多少個JS約定方法,都須要在這個委託方法中,對message.name進行區分判斷而後分開處理。若是寵物在說fire的同時,把攻擊座標一塊兒說了出來,那麼,咱們也要能拿到座標才行,這個座標,就在message.body裏。對於這一套流程,我我的作了個小小封裝處理,簡化了註冊和處理流程,這是後話,結尾再提。
上面的咒語有個委託綁到了本身身上,這樣會致使寵物沒法召回,稍後會說到怎麼處理避免這種狀況。
第二章 第三節 -- "寵物語逆向解析"
上一節講了怎麼和寵物約定本身的動做事件,能夠接收到寵物傳過來的信息,對於這些信息,都須要提早約定好,而咱們傳遞給寵物的命令信息,也須要約定。畢竟它也聽不懂咱們的語言。當咱們須要撤退時,咱們須要告訴它。固然,咱們也能夠把撤退座標一塊兒傳過去。
1 dispatch_async(dispatch_get_main_queue(), ^{ 2 [webView evaluateJavaScript:@"retreat('14','15')" completionHandler:nil]; 3 });
在執行JS時最好在主線程進行。這樣,咱們就能夠說「retreat(&……*&¥)」的話,它就知道該怎麼作了。
第三章 第一節 -- "管理"
這一節只說WKNavigationDelegate的委託協議。咱們要想更好的管理寵物的方方面面,須要監控它的一舉一動。
// 頁面開始加載時調用 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation; // 當內容開始返回時調用 - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation; // 頁面加載完成以後調用 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation; // 頁面加載失敗時調用 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
除了上面幾個經常使用的咒語,還有一些用來控制跳轉的:
// 接收到服務器跳轉請求以後調用 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation; // 在收到響應後,決定是否跳轉 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler; // 在發送請求以前,決定是否跳轉 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
在這些方法裏,作一些想作的事情,這樣,寵物就能夠最大化的發揮做用。或許,你須要注入一段JS自動填充web表單,那麼就能夠在頁面加載完成的委託方法裏,執行JS語句。
1 [webView evaluateJavaScript:@"$('#user-name').val(\"李剛\");$('#user-id').val(\"330211299608164113\");$('#creditCard').val(\"320248476988112\");$('#cvn2Num').val(\"245\");$('#timeNum').val(\"0722\");$('#user-phone').val(\"13146853977\");$(\"#user-phone\").trigger(\"keyup\");" completionHandler:^(id _Nullable r, NSError * _Nullable error) { 2 if (error) 3 { 4 NSLog(@"[執行js錯誤]%@", error); 5 } 6 }];
這樣,咱們就能夠把它玩弄於股掌之間。爲所欲爲想作什麼就作什麼,哈哈哈,咳咳YY了一下。
第三章 第三節 -- "使用"
做爲最終章節,這裏說明如何在召喚寵物後,進行做戰使用。在召喚出寵物,並作好相關的準備後,就可讓寵物陪同做戰了。寵物做戰方式能夠分爲兩種,按需選擇。第一種:遠攻,也叫請求網絡路徑,第二種:近戰,也叫加載本地文件。
1 //遠攻示意 2 NSURL *url = [NSURL URLWithString:URLString]; 3 [webView loadRequest:[NSURLRequest requestWithURL:url]]; 4 5 //近戰示意 6 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 7 8 [webView loadHTMLString:[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil] baseURL:[[NSBundle mainBundle] bundleURL]];
這樣咱們的寵物助手就派上用場啦。這裏要注意的是,只有在iOS9及以上版本中,寵物纔會這種方式的近戰。
說明手冊大概就講這麼多吧,寵物其實很好調教的,只要用對地方,可讓自身更增強大。至於在使用中會遇到一些問題,並不影響我對它的喜好。
上文中提到寵物沒法召回的狀況,還有封裝簡化的處理,這裏快速說明一下。使用 addScriptMessageHandler:name: 添加事件時,若是綁定的是本身,那麼是沒法完全釋放的,因此這裏能夠本身寫個委託類,弱引用持有本身,實現 userContentController:didReceiveScriptMessage: 委託方法。而後在這個方法裏進行處理。若是咱們約定了不少的咒語,好比我,是個lv100的法師,寵物也確定很強大啦,咱們之間約定了好多戰鬥時用到的咒語,若是按照普通的方法在委託方法裏寫if一個一個判斷message.name,那個人咒語符都寫不下了。因此呢,我就簡化了一下咒語。
1 //數組裏是自定義的model。裏面存放個人語言和對應的寵物的語言 2 for (webJScriptItem *item in mothedList) 3 { 4 if ([item.jsMothodName isEqualToString:message.name]) 5 { 6 SEL selector = NSSelectorFromString(item.ocMothodName); 7 8 [self performSelector:selector withObject:message.body]; 9 10 break; 11 } 12 }
先到這裏吧。
懶得寫了,確實好懶。