2011-07-14 5 views
15

में छवियों के साथ एक संपूर्ण वेब पेज कैश करने के लिए कैसे मैं आईओएस पर एक छवि-पाठ मिश्रण पृष्ठ पर काम कर रहा हूं। मुझे पता है कि लक्ष्य प्राप्त करने के लिए UIWebView का उपयोग करना मेरे लिए संभव है। लेकिन समस्या यह है कि उपयोगकर्ता को पृष्ठ को ऑफ़लाइन पढ़ने की आवश्यकता हो सकती है। टेक्स्ट भाग के लिए, मैं HTML को डिस्क पर सहेज सकता हूं और इसे ऑफ़लाइन मोड में लोड कर सकता हूं। लेकिन छवियों के बारे में कैसे? क्या डिस्क को छवियों को कैश करना संभव है और UIWebView अभी भी उन्हें प्रदर्शित करने में सक्षम हो सकता है?आईओएस

धन्यवाद!

उत्तर

15

ASIHTTPRequest project एक वर्ग ASIWebPageRequest कहा जाता है जो वास्तव में आप क्या चाहते करने के लिए डिज़ाइन किया गया है है। आप अपने प्रोजेक्ट के लिए एक अतिरिक्त निर्भरता को जोड़ने के साथ ठीक कर रहे हैं तो मुझे लगता है कि यह आप के लिए एक अच्छा समाधान है: ASIWebPageRequest

पेज मैं पसंद आया पर ऊपर वहाँ यह कैसे उपयोग करने के लिए कुछ अच्छे उदाहरण हैं, लेकिन मैं उनमें से एक यहां संपूर्णता के लिए शामिल करेंगे:

- (IBAction)loadURL:(NSURL *)url 
{ 
    // Assume request is a property of our controller 
    // First, we'll cancel any in-progress page load 
    [[self request] setDelegate:nil]; 
    [[self request] cancel]; 

    [self setRequest:[ASIWebPageRequest requestWithURL:url]]; 
    [[self request] setDelegate:self]; 
    [[self request] setDidFailSelector:@selector(webPageFetchFailed:)]; 
    [[self request] setDidFinishSelector:@selector(webPageFetchSucceeded:)]; 

    // Tell the request to embed external resources directly in the page 
    [[self request] setUrlReplacementMode:ASIReplaceExternalResourcesWithData]; 

    // It is strongly recommended you use a download cache with ASIWebPageRequest 
    // When using a cache, external resources are automatically stored in the cache 
    // and can be pulled from the cache on subsequent page loads 
    [[self request] setDownloadCache:[ASIDownloadCache sharedCache]]; 

    // Ask the download cache for a place to store the cached data 
    // This is the most efficient way for an ASIWebPageRequest to store a web page 
    [[self request] setDownloadDestinationPath: 
     [[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:[self request]]]; 

    [[self request] startAsynchronous]; 
} 

- (void)webPageFetchFailed:(ASIHTTPRequest *)theRequest 
{ 
    // Obviously you should handle the error properly... 
    NSLog(@"%@",[theRequest error]); 
} 

- (void)webPageFetchSucceeded:(ASIHTTPRequest *)theRequest 
{ 
    NSString *response = [NSString stringWithContentsOfFile: 
     [theRequest downloadDestinationPath] encoding:[theRequest responseEncoding] error:nil]; 
    // Note we're setting the baseURL to the url of the page we downloaded. This is important! 
    [webView loadHTMLString:response baseURL:[request url]]; 
} 
+0

धन्यवाद ज्यादा इस नमूने के लिए, यह बाद में कोशिश करेंगे। क्या आप मुझे बता सकते हैं कि ASIReplaceExternalResourcesWithData डेटा को डेटा में एम्बेड कैसे कर सकता है? पृष्ठ कैश में एक HTML फ़ाइल बनी हुई है, है ना? क्या अनुरोध मूल HTML को संशोधित करता है? –

+0

हाँ, आप सही हैं। एएसआई पेज को संशोधित करता है और साथ [डेटा यूआरआई] (http://en.wikipedia.org/wiki/Data_URI_scheme) उन परिसंपत्तियों बदल देता है। वैकल्पिक रूप से, आप जो फ़ाइलों के रूप में संसाधनों डाउनलोड करेगा, लेकिन अभी भी इन स्थानीय फ़ाइलों में बात करने के लिए HTML संशोधित 'ASIReplaceExternalResourcesWithLocalURLs' कहा जाता है एक अलग URL प्रतिस्थापन मोड का उपयोग कर सकते हैं। – xoebus

+0

धन्यवाद xoebus। मैं भी पता चला कि ऑफ़लाइन ब्राउज़िंग सक्षम करने, मैं कोड की इस पंक्ति जोड़ने की जरूरत: 'request.cachePolicy = ASIAskServerIfModifiedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy;' –