2013-05-02 45 views
0

我有一個包含「#」 URL字符串。例如,如何使用WebView加載包含「#」的NSURL?

NSString* urlStr = @"https://developer.apple.com/library/ios/#/legacy/library/documentation/Xcode/Conceptual/ios_development_workflow/10-Configuring_Development_and_Distribution_Assets/identities_and_devices.html#//apple_ref/doc/uid/TP40007959-CH4-SW"; 
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSURL* url = [NSURL URLWithString:urlStr]; 
[[self.webViewSample mainFrame] loadRequest:[NSURLRequest requestWithURL:url]]; 

使用編碼後,「#」是由「%23」代替。如果你不使用的編碼,該NSURL會無。 我的問題是,web瀏覽器加載不正確的網頁是不同於Browser.How我可以處理這個url字符串,以便我可以加載正確的網頁?

+0

ADC的網頁被‘優化’的iOS爲好。除非您以某種方式管理更改其用戶代理字符串,否則無法真正阻止將Web視圖重定向到移動版本而不是桌面版本。 – 2013-05-02 10:57:27

+0

爲什麼我的桌面網絡瀏覽器可以正確處理這個問題?它會改變它的用戶代理嗎? – gohamgx 2013-05-02 11:01:01

+0

(facepalm)否 - 它有一個*不同的*用戶代理(你應該知道那是什麼東西)。 – 2013-05-02 11:02:11

回答

2

所以我現在想你的問題,根本問題是蘋果的文檔使用一些相當奇怪的形成的網址。它們包含多個#字符,這對於URL而言在技術上並不有效。第一個是有效的(而且很重要);任何其他人都應該逃脫。

Safari能夠處理這個,我認爲它不僅僅是顯示/使用原始URL字符串。我發現迄今最好的解決辦法是將移交給WebView的紙板處理,像這樣:

- (NSURL *)URLFromString:(NSString *)string; 
{ 
    static NSPasteboard *pboard; 
    if (!pboard) pboard = [[NSPasteboard pasteboardWithUniqueName] retain]; 

    [pboard clearContents]; 
    [pboard writeObjects:@[string]]; 

    NSURL *result = [WebView URLFromPasteboard:pboard]; 
    return result; 
} 

更多細節在http://www.mikeabdullah.net/webkit-encode-unescaped-urls.html

+0

嘿,邁克,我認爲這個功能很好。我試過了,它可以把第二個#換成%23。 – gohamgx 2013-05-04 02:41:35

2

嘗試這樣,

/# it'l工作

UIWebView *web=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    NSString* urlStr = @"https://developer.apple.com/library/ios//#/legacy/library/documentation/Xcode/Conceptual/ios_development_workflow/10-Configuring_Development_and_Distribution_Assets/identities_and_devices.html/#//apple_ref/doc/uid/TP40007959-CH4-SW"; 
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    NSURL* url = [NSURL URLWithString:urlStr]; 
    [web loadRequest:[NSURLRequest requestWithURL:url]]; 
    [self.view addSubview:web]; 

enter image description here

+0

謝謝您的回答。但我的webview運行良好,它只是加載不正確的網頁。我將「#」替換爲「/#」,問題仍然存在。 – gohamgx 2013-05-02 12:58:33

+0

這裏有什麼問題? – Balu 2013-05-02 13:00:49

+0

我保存這個網址作爲書籤,我點擊書籤,瀏覽器打開一個新的窗口正確加載它。但我輸入此網址到瀏覽器的網址textfield和瀏覽器跳轉到導航頁面。我想有緩存的書籤。 – gohamgx 2013-05-02 13:09:28

3
NSString* urlStr = @"https://developer.apple.com/library/ios/#/legacy/library/documentation/Xcode/Conceptual/ios_development_workflow/10-Configuring_Development_and_Distribution_Assets/identities_and_devices.html#//apple_ref/doc/uid/TP40007959-CH4-SW"; 
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSURL* url = [NSURL URLWithString:urlStr]; 

更換#使用編碼後, 「#」 被「取代% 23" 。

嗯,是的。這就是你告訴它要做的。

如果你不想那樣做,那麼不要這樣做。

如果你不使用編碼,NSURL將爲零。

這是因爲有兩個#,所以你的網址是無效的。即使NSURL(這是非常寬容的網址)拒絕它是有道理的。

取出第一,只有第一,#:(這種方法是有點脆弱,你可以把通過finding the range of the first match,然後only replacing within that range它變得更強大)

urlStr = [urlStr stringByReplacingOccurrencesOfString:@"/#" 
    withString:@""]; 

現在你URL是有效的,所以NSURL將沒有問題。

+0

那麼,我應該如何編寫正則表達式並使其通用? – gohamgx 2013-05-03 01:38:55

+0

@gohamgx:我不確定「common」是什麼意思,但表達式應該是'/ +#/ +',你用'/'替換,你應該找到第一個匹配,然後替換在第一場比賽範圍內的所有比賽(只會取代那場比賽)。 – 2013-05-03 02:35:24

+0

常見手段使正則表達式匹配大多數情況 – gohamgx 2013-05-03 02:38:49

1

問題的根源在於Apple的文檔鏈接不是有效的URL,所以NSURL會做它應該做的事,並拒絕將URL做出來。

如果你用%23替換第二個#,NSURL將會像「okaaaaaaaaay」一樣給你一個NSURL對象,並且你的webview將打開到正確的頁面。

+0

刪除第一個#(以及其中任一側的斜線之一)可以實現相同的結果,即使URL有效。 – 2013-05-02 23:30:47

+0

重寫URL(就像移除錨點一樣)不一定是最好的做法。您不知道將來如何接收請求的服務器解釋它。 – zadr 2013-05-03 01:52:57

+0

是的,所以,應該有一個功能,並使事情共同 – gohamgx 2013-05-03 02:04:08