2011-09-01 68 views
1

我們正在爲iOS開發混合應用程序。大部分應用程序都是在UIWebView中運行的WebApp。有時需要應用程序的本機部分修改URL,添加一些參數。我知道我們可以使用「替代」解決方案(例如獨立於Web視圖的本地應用與服務器對話);不過,我主要對URL擴充的一個好的安全解決方案感興趣。什麼是最好(最安全)的方式來增加UIWebView使用的URL?

我一直在尋找「最好」的技術來做到這一點,並發現兩個似乎(主要)工作。

技術#1 - 重新初始化URL

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSLog(@"GOTO: %@", [[request URL] absoluteString]); 
    NSURL * oldurl = request.URL; 
    [[request URL] initWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]]; 
    return YES; 
} 

技術#2 - 拒絕該第一URL和子在一個新

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSURL * oldurl = request.URL; 
    if ([self isFixed:oldurl]) { 
     return YES; 
    } else { 
     NSURL * newurl = [NSURL URLWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]]; 
     [theWebView loadRequest:[NSURLRequest requestWithURL:newurl]]; 
     return NO; 
    } 
} 

技術#2似乎會在某些頁面上導致文物(「iFrame加載中斷」,可能還有其他問題)。

我很好奇,如果其他人已經做了像這樣的網址替換,或通過其他技術,或者如果任何人都知道技術#1(我希望使用)的問題。

我知道方法swizzling不推薦,並且Apple的文檔建議不要繼承UIWebView的子類。

謝謝!

UPDATE 哎呀 - 技術#1實際上沒有工作。我的實際代碼做得比我發佈的還要多,而且它似乎只能工作......這可能是個好消息,因爲我希望它有點邪惡。

+0

如果你想添加一個參數到一個URL這個代碼是更堅實一點:http://stackoverflow.com/questions/7026916/passing-arguments-into-url-string-objective-c/7027608#7027608 – Jano

+0

啊,我會試一試這些技巧。有一點擔心,那個職位沒有被接受的解決方案。 – Dave

+0

@Jano,謝謝你的建議;然而,你的其他答案是簡單地製作一個新的URL。我需要做的是更新將被UIWebView使用的URL。 – Dave

回答

1

永遠不要在已經初始化的對象上調用-init方法。這是沒有定義的行爲。這很可能是你在這裏泄漏內存,因爲舊的請求ivars可能沒有正確釋放。

通常優選與第二種方法類似的東西。

另一種方法是使用NSURLProtocol將自己注入URL加載過程。這樣做,您可以使用修改後的NSURLRequest創建自己的NSURLConnection

+0

我想更多地探討這一點,因爲我認爲這可能是最「正確」的解決方案。不幸的是,在槍下一點,我現在正在使用我自己的技術#2。也許我會有時間嘗試這種方法,並可以返回並對其進行評論。 (目前,不完全理解這些API,所以任何額外的指針將不勝感激。) – Dave

+0

我應該寫一篇關於NSURLProtocol的博客文章。這是非常有用的東西。看一下'ProxyURLProtocol'就是一個非常接近你所做事情的例子。看看如何在'initWithRequest:...'我重寫請求類似於你如何描述? https://github.com/PandoraBoy/PandoraBoy/blob/master/ProxyURLProtocol.m –

+0

謝謝,我會在週末看看! – Dave

0

這是另一種嘗試的方式。我與stringByEvaluatingJavaScriptFromString:玩時,發現我能做到這一點:

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSString *oldUrlString = [NSString stringWithFormat:"%@", request.URL.absoluteURL]; 

    if ([oldUrlString isEqualToString:@"http://www.google.com/"]) 
    { 
     [webView stringByEvaluatingJavaScriptFromString:@"window.location = \"http://www.arstechnica.com\""]; 

     return NO; 
    } 

    return YES; 
} 

我設法使用JavaScript注入重定向到www.google.com第一請求被拒絕,並重定向到www.arstechnica。 com(我剛選了一個隨機站點)。

我認爲它比熱插拔URL好一點。

+0

有趣。我想我可能會使用js注入來重新編寫頁面加載中的某些錨點。這看起來好像會起作用,可能比技術#2更清潔。 – Dave

相關問題