Just a Computer Graphics Studio & My Life

[iOS] 從WebView被動取得資料

記得先前有研究過從WebView取得回傳值,這是當我們知道web中有可以執行的函式,而iOS的WebView能夠呼叫。假使若不知道怎麼辦?只能猜測?好像也只有這個辦法,當然若想串接就要雙方講好規則,無論被動還是主動都可以實現!

這次想做從WebView被動取得資料,注意這裡是被動,情境是在使用者點擊按鈕,iOS的WebView會收到請求,此時就可以拆解請求的URL來進行接續動作。

iOS Webview javascript

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

iOS Webview javascript2

被動取得的結果我抓了一些:

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

destination: https://accounts.google.com/Logout?continue=https%3A%2F%2Fwww.google.com.tw%2F&manage=true&timeStmp=1464662292&secTok=.AG5fkS8cyiHVaVya3HzkFy4exQPubfgsfw%3D%3D

destination: http://www.google.com.tw/accounts/Logout2?ilo=1&ils=s.TW&ilc=0&continue=https%3A%2F%2Fwww.google.com.tw%2F&zx=1266228053

若沒有跟網頁工程師溝通好,就只好判斷會出現的關鍵字來處理囉!

想要登出?看看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的溝通

參考:

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: