2013-04-13 60 views

回答

23

是的,這是可能的。在你的HTML,你寫一個JS加載URL用假方案,如

window.location = "request_for_action://anything/that/is/a/valid/url/can/go/here"; 

然後,在你的iOS代碼,委託指定的網頁視圖,並在您的委託,辦理

webView:shouldLoadWithRequest:navigationType 

喜歡的東西

if([request.URL.scheme isEqualToString: @"request_for_action"]) 
{ 
    // parse your custom URL to extract parameter, use URL parts or query string as you like 
    return NO; // return NO, so webView won't actually try to load this fake request 
} 

-

只是順便說一句,你可以做其他的方式,讓iOS的合作de在你的html中調用一些JS代碼 使用

NSString* returnValue = [self.webView stringByEvaluatingJavaScriptFromString: "someJSFunction()"]; 
9

是的!當用戶按下鏈接時,您可以在網絡視圖的代理中聽到它,然後可以執行任何您想要的操作。強大的東西可以這樣完成。

網絡視圖的委託被髮送webView:shouldStartLoadWithRequest:navigationType:。您可以分析發生的情況,並根據需要進行回覆。爲了防止網絡視圖試圖跟隨鏈接(畢竟這可能是完全假的),只需返回NO。

在這個來自TidBITS新聞應用程序的例子中,我在網頁上有一個鏈接,它使用了一個完全構成的play:方案。我發現,在代表和玩法:

- (BOOL)webView:(UIWebView *)webView 
     shouldStartLoadWithRequest:(NSURLRequest *)r 
     navigationType:(UIWebViewNavigationType)nt { 
    if ([r.URL.scheme isEqualToString: @"play"]) { 
     [self doPlay:nil]; 
     return NO; 
    } 
    if (nt == UIWebViewNavigationTypeLinkClicked) { 
     [[UIApplication sharedApplication] openURL:r.URL]; 
     return NO; 
    } 
    return YES; 
} 
+0

它看起來正是我需要完成的。但我不知道我在哪裏放這個方法?順便說一句,謝謝你的描述性答案! –

+0

你把它放在UIWebView的代表的任何地方! – matt

+0

太棒了,這個工程! :)還有一個問題:爲什麼當我點擊預定義的url-scheme鏈接時,應用程序會重定向到Safari並嘗試打開它? –

2

落實UIWebViewDelegate方法webView:shouldStartLoadWithRequest:navigationType:

根據需要處理navigationType和請求。

+0

我已經設置了委託並實現了uiwebview委託方法。但是當我點擊一些uiwebview內容時,我的委託方法都沒有被調用。沒有回調。應該做什麼? – iPhoneDeveloper

+0

@iPhoneDeveloper你應該發佈你自己的問題和所有相關的細節。 – rmaddy

相關問題