(UIWebViewで)タップしたリンクのファイルの末尾がである場合に検出する「ダウンロードマネージャー」を作成するにはどうすればよいですか? "。pdf"、 "。png"、 "。jpeg"、 「.tiff」、「。gif」、「。doc」、「。docx」、「。ppt」、「。pptx」、「。xls」、「。xlsx」、次にダウンロードするか開くかを尋ねるUIActionSheetを開きます。ダウンロードを選択すると、そのファイルがデバイスにダウンロードされます。
アプリの別のセクションには、ダウンロードされたファイルのリストがUITableViewにあり、それらをタップするとUIWebViewに表示されますが、ダウンロードされたときにローカルに読み込まれるため、もちろんオフラインになります。
私がやろうとしていることをよりよく理解するには、 http://iTunes.Apple.com/gb/app/downloads-lite-downloader/id349275540?mt=8 を参照してください。
これを行うための最良の方法は何ですか?
UiWebViewのデリゲートでメソッド- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
を使用して、リソースをいつロードするかを決定します。
メソッドが呼び出されたら、パラメータ(NSURLRequest *)request
からURLを解析し、それが目的のタイプの1つである場合はNOを返し、ロジック(UIActionSheet)を続行するか、ユーザーが単純なものをクリックした場合はYESを返す必要があります。 HTMLファイルへのリンク。
意味がありますか?
Edit_:簡単なコード例をよりよく理解するため
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if(navigationType == UIWebViewNavigationTypeLinkClicked) {
NSURL *requestedURL = [request URL];
// ...Check if the URL points to a file you're looking for...
// Then load the file
NSData *fileData = [[NSData alloc] initWithContentsOfURL:requestedURL;
// Get the path to the App's Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
[fileData writeToFile:[NSString stringWithFormat:@"%@/%@", documentsDirectory, [requestedURL lastPathComponent]] atomically:YES];
}
}
Edit2_:チャットでの問題について話し合った後、コードサンプルを更新しました:
- (IBAction)saveFile:(id)sender {
// Get the URL of the loaded ressource
NSURL *theRessourcesURL = [[webView request] URL];
NSString *fileExtension = [theRessourcesURL pathExtension];
if ([fileExtension isEqualToString:@"png"] || [fileExtension isEqualToString:@"jpg"]) {
// Get the filename of the loaded ressource form the UIWebView's request URL
NSString *filename = [theRessourcesURL lastPathComponent];
NSLog(@"Filename: %@", filename);
// Get the path to the App's Documents directory
NSString *docPath = [self documentsDirectoryPath];
// Combine the filename and the path to the documents dir into the full path
NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docPath, filename];
// Load the file from the remote server
NSData *tmp = [NSData dataWithContentsOfURL:theRessourcesURL];
// Save the loaded data if loaded successfully
if (tmp != nil) {
NSError *error = nil;
// Write the contents of our tmp object into a file
[tmp writeToFile:pathToDownloadTo options:NSDataWritingAtomic error:&error];
if (error != nil) {
NSLog(@"Failed to save the file: %@", [error description]);
} else {
// Display an UIAlertView that shows the users we saved the file :)
UIAlertView *filenameAlert = [[UIAlertView alloc] initWithTitle:@"File saved" message:[NSString stringWithFormat:@"The file %@ has been saved.", filename] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[filenameAlert show];
[filenameAlert release];
}
} else {
// File could notbe loaded -> handle errors
}
} else {
// File type not supported
}
}
/**
Just a small helper function
that returns the path to our
Documents directory
**/
- (NSString *)documentsDirectoryPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
return documentsDirectoryPath;
}