記得先前有研究過從WebView取得回傳值,這是當我們知道web中有可以執行的函式,而iOS的WebView能夠呼叫。假使若不知道怎麼辦?只能猜測?好像也只有這個辦法,當然若想串接就要雙方講好規則,無論被動還是主動都可以實現!
這次想做從WebView被動取得資料,注意這裡是被動,情境是在使用者點擊按鈕,iOS的WebView會收到請求,此時就可以拆解請求的URL來進行接續動作。
UIWebView設定delegate,如此當使用者點擊按鈕時,就能被動收到請求。
/** Theme: Interact with WebView IDE: Xcode 7 Language: C++ Date: 105/05/31 Author: HappyMan Blog: https://cg2010studio.wordpress.com/ */ - (void)setupWebView { NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com.tw/"]]; [displayWebView loadRequest:request]; NSString *result = [displayWebView stringByEvaluatingJavaScriptFromString:@"1+2"]; DxLog(@"result: %@", result); } -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *destination = [request.URL absoluteString]; DxLog(@"destination: %@", destination); if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSArray *parts = [destination componentsSeparatedByString:@"/"]; } return YES; }
有趣的是主動執行的結果是:
result: 3
被動取得的結果我抓了一些:
destination: https://accounts.google.com/ServiceLogin?hl=en&passive=true&continue=https://www.google.com.tw/
destination: https://accounts.google.com/ServiceLoginAuth
destination: https://accounts.google.com/SignOutOptions?continue=https%3A%2F%2Fwww.google.com.tw%2F
若沒有跟網頁工程師溝通好,就只好判斷會出現的關鍵字來處理囉!
想要登出?看看URL有沒有logout關鍵字,有的話就退回到iOS的登入頁吧~
如此,就能做到App和Web雙向溝通:
- Call Javascript function from Objective-C
- Call Objective-C function from Javascript
最後想說,iOS 7後有更好的做法,SDK發展出JavaScriptCore Framework,如此便不用拐彎抹角等delegate響應!
更新:
iOS 7之後有更好的做法,可參考文章:Objective C與Javascript的溝通。
參考:
Comments on: "[iOS] 從WebView被動取得資料" (1)
現在寫加密 WebView,要取得 App 登入 Token,需要用到~🙃
讚讚