å½ããã°ã®ã¢ã¯ã»ã¹ãã°ãè¦ã¦ããã¨ãshouldStartLoadWithRequestã«ã¤ãã¦æ¸ãããUIWebViewå ã®ç»é¢é·ç§»ãããã¯ããããå§åçã«äººæ°ã³ã³ãã³ãã§ããããã§ãã
ããã§ãå¿ç¨ç·¨ã¨ãã¦ãã¢ããªå ã®UIWebViewç»é¢ã§ãwebãµã¤ãä¸ã®ãã¡ã¤ã«ã¸ã®ãã¦ã³ãã¼ããªã³ã¯ãã¯ãªãã¯ããã¨ãã®ã¢ããªã®ããã¥ã¡ã³ããã©ã«ãã«ç´æ¥DLãããããªä»çµã¿ãä½ã£ã¦ã¿ã¾ãã
ã¢ã¤ãã¢ã¨ãã¦ã¯ãshouldStartLoadWithRequestã®requestãã©ã¡ã¼ã¿ã«å«ã¾ã ãURLãæ½åºããäºåã«ãã®URLã«å¯¾ãã¦HEADãªã¯ã¨ã¹ããéã£ã¦ãDLå¯è½ãªãã¡ã¤ã«ã¸ã®URLãã©ããå èªã¿ããDLå¯è½ãªããã®ã¾ã¾DLããDL対象ã§ãªãæ®éã®htmlãã¼ã¸ãªã³ã¯ã®å ´åã¯UIWebViewã«å¶å¾¡ãè¿ãã¨ãããã®ã§ãã
ãªã³ã¯å ã®å èªã¿ã¨DLã«ã¯ãããªãã¿ASIHttpRequestã使ãã¾ãã(éçºã¯çµäºãã¦ãã¾ãã¾ããããã)
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
Log( @"manualLoading=%@",manualLoading ? @"YES" : @"NO" );
if( manualLoading ){ // å
èªã¿å
NSURL* url = [request URL];
// HEADã¡ã½ããã使ç¨
ASIHTTPRequest *req = [[ASIHTTPRequest requestWithURL:url] HEADRequest];
req.tag = kRequestForHeader;
[req setDidFinishSelector:@selector(requestDone:)];
[req setDidFailSelector:@selector(requestWentWrong:)];
[req setDelegate:self];
[self.queue addOperation:req];
[self.queue go];
return NO;
}else{ // å
èªã¿å¾
return YES;
}
return NO;
}
UIWebViewã®delegateã§ããHTWebViewControllerã¯ãshouldStartLoadWithRequestãéããããããã£ãããã¹ã¦ã®æä½ã«å¯¾ãã¦NOãè¿ãã¾ãã
åæã«ãASIHttpRequestãªãã¸ã§ã¯ããä½ã£ã¦ãrequestãã©ã¡ã¼ã¿ã«å«ã¾ããURLãã³ãã¼ãã¾ãã HEADRequestã¯httpå é¨ã®ãã©ã¡ã¼ã¿ã¯ãã®ã¾ã¾ã«ãHEADã¡ã½ãããéåºããã¤ã³ã¹ã¿ã³ã¹ãçæããã¡ã½ããã§ãã
ããããã
- (void)viewDidLoad
{
....
self.queue.requestDidReceiveResponseHeadersSelector = @selector(request:DidReceiveResponseHeaders:);
....
}
ã§ãASINetworkQueueãã¬ã¹ãã³ã¹ããããåãåã£ãã¨ãã®ããªã²ã¼ãã¡ãã»ã¼ã¸(request:DidReceiveResponseHeaders:)ãåãåãããã«ãã¦ããã¨ããããæ å ±ãåå¾ã§ãã¾ããåå¾ãããããæ å ±ã®ä¸èº«ãè¦ã¦ããã¦ã³ãã¼ãããã®ãã UIWebViewã«ãã¼ã¸ããªã¯ã¨ã¹ããããã®ãã夿ãã¾ãã
-(void)request:(ASIHTTPRequest*) request DidReceiveResponseHeaders:(NSDictionary*)responseHeders
{
....
// Content-TypeãPDFãã¡ã¤ã«
if( ! NSEqualRanges([[responseHeders objectForKey:@"Content-Type"] rangeOfString:@"application/pdf" options:NSAnchoredSearch|NSCaseInsensitiveSearch],NSMakeRange(NSNotFound,0))){
ASIHTTPRequest* req = [ASIHTTPRequest requestWithURL:[request url]];
NSArray* paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// ãã¦ã³ãã¼ãå
ãã©ã«ãããµã³ãããã¯ã¹ã³ã³ããã«è¨å®ããã¡ã¤ã«åã¯UUIDã«ãã
[req setDownloadDestinationPath:[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.pdf",[self newUUIDString]] ]];
[req setDidFinishSelector:@selector(downloadDone:)];
[req setDidFailSelector:@selector(downloadFailed:)];
[req setDelegate:self];
[self.queue addOperation:req];
[self showProgressView];
[self.queue go];
return;
}
// é常ã®Webãã¼ã¸ãªã©,UIWebViewã«å¦çããããå ´å
if( [@"text/html" isEqualToString:[responseHeders objectForKey:@"Content-Type"]] ){
NSURLRequest* requestx = [NSURLRequest requestWithURL:[request url]];
// ç¡éã«ã¼ã対ç
manualLoading = NO;
[self.webView loadRequest:requestx];
return;
}
}
ä¸ã®ã¡ã½ããå ã§ããã®ãã¥ã¼ã³ã³ããã¼ã©ããUIWebViewã«å¯¾ãã¦loadRequest:ãéã£ã¦æç¤ºçã«ãã¼ã¸ããã¼ããããå ´åããwebView:shouldStartLoadWithRequest:navigationType:ãéããã¦ãããããç¡éã«ã¼ãã«é¥ããªãããmanualLoadingã¨ãããã©ã°ã§å¦çãã¦ãã¾ããããããç´°ããç¶æ ãå¶å¾¡ãããªãNSMutableURLRequestã¤ã³ã¹ã¿ã³ã¹ãçæãã¦ãããæ å ±ã追å ãããªã©ããã°è¯ãã§ãããã
å®ç¨ã§ä½¿ãä¸ã§ã¯ããã¨ãã°ãã¡ã¤ã«ããã¦ã³ãã¼ãããã«ã¯ãã°ã¤ã³çã®èªè¨¼ãå¿ è¦ã ã£ãããããµã¤ããæ³å®ããããªã©ããã®ã§ãcookieãã¯ããã¨ããä»ã®ãããæ å ±ãå種ãªã¯ã¨ã¹ããªãã¸ã§ã¯ãã®éã§ã³ãã¼ãã¦å¼ãç¶ããªã©ãããç´°ããå¦çãå¿ è¦ã§ããï¼åå¾å ã«ç½®ããã¦ãããã¼ã¿ããã¦ã³ãã¼ãããå¾ã®åãæ±ãã§ã¯ãã»ãã¥ãªãã£ã«ã注æãã ãããï¼ã¨ããããUIWebViewã®æåã®ä¸é¨ã横åããããã¨ã§ããã¡ã¤ã«ãã¢ããªã®ãµã³ãããã¯ã¹ã³ã³ããã«ãã¦ã³ãã¼ãã§ãã¾ãã
ãµã³ãã«ããã°ã©ã å ¨ä½ã
https://github.com/ponpoko1968/HTTPDownloaderTest
ã«ç½®ããã®ã§ãé©å½ã«forkãã¦æ¹é ãã¦ä½¿ã£ã¦ä¸ããã