2014-01-21 45 views
0

我有一個應用程序可以創建HTML頁面並在WebView中顯示它們。這部分工作很好。如何通過動態創建的HTML使用WebView

我的應用程序具有控件,允許用戶查看不同的數據。我可以在WebView中加載一個新的HTML字符串。再次,這工作正常。

我有兩個相關的問題:首先,我的動態創建的HTML頁面包含對<img>標籤中圖像的引用,這些標籤實際上是在專有文件中進行本地壓縮和存儲的。我可以根據請求將它們加載到某種Cocoa圖像對象中,或者我可以將它們解壓縮到一個文件中並允許WebView加載它們。後者可能很簡單,但我正在尋找實現前者的方法。我想我需要對webView:resource:willSendRequest:redirectResponse:fromDataSource:消息作出響應/反應,以便以某種方式傳遞WebView圖像。任何提示?其次,如果用戶選擇一個鏈接,我需要攔截鏈接的處理並自己處理。如果鏈接實際引用頁面上的某個位置,或者(更頻繁地)我將要加載一個完全不同的頁面 - 我再次通過我的應用程序動態創建並加載爲使用loadHtmlString:baseUrl:將字符串轉換爲WebView。我只想簡單通知URL,以便我可以決定如何處理它(因爲我在iOS中使用UIWebView),但我不確定最佳/最簡單的方法。

我把這些問題歸結在一起,因爲可能有一種通用的方式來查看我錯過的整個問題。例如,似乎應該有一種方法來取代正常的頁面加載過程,以便WebView向我的應用程序詢問它通常會向Web請求的字節。我得到的印象是WebView做它自己的事情,只有建議我,它正在從Web加載頁面/資源。我需要它來真正地向我請求數據。

回答

2

最好的方法是實現你自己的NSURLProtocol的子類,它可以返回你需要的資源。這樣您就可以使用自己的內部URL,URL加載系統將通過調用NSURLProtocol子類中的方法來獲取它們。

這樣做確實很容易,您需要執行+canInitWithRequest:以檢查您的特殊網址方案,例如

+ (BOOL)canInitWithRequest:(NSURLRequest *)request 
{ 
    NSString *scheme = [[request URL] scheme]; 
    return [scheme caseInsensitiveCompare:@"app"] == NSOrderedSame; 
} 

然後進行-startLoading方法返回正確的數據,例如:

- (void)startLoading 
{ 
    NSURLRequest *req = [self request]; 
    id<NSURLProtocolClient> client = [self client]; 
    NSCachedURLResponse *cachedResponse = [self cachedResponse]; 

    if (cachedResponse) { 
    [client URLProtocol:self cachedResponseIsValid:cachedResponse]; 
    return; 
    } 

    // support app:blank 
    if ([[[req URL] resourceSpecifier] isEqualToString:@"blank"]) { 
    NSData *data = [NSData data]; 

    NSURLResponse *response 
     = [[NSURLResponse alloc] initWithURL:[req URL] 
            MIMEType:@"text/html" 
        expectedContentLength:[data length] 
          textEncodingName:@"UTF-8"]; 

    [client URLProtocol:self 
    didReceiveResponse:response 
    cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 

    [client URLProtocol:self didLoadData:data]; 

    [client URLProtocolDidFinishLoading:self]; 
    return; 
    } 

    // Not found 
    NSError *error = [NSError errorWithDomain:NSURLErrorDomain 
             code:NSURLErrorFileDoesNotExist 
            userInfo:nil]; 

    [client URLProtocol:self didFailWithError:error]; 
} 
相關問題