iOS與web交互的那些事

  一轉眼又是大半年過去了,除了上架了一款新應用外,也沒什麼進步。因此最近琢磨着搞點事情,否則我那本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     }

  先到這裏吧。

  懶得寫了,確實好懶。

相關文章
相關標籤/搜索