Je ne connais pas Objective-C et je souhaite télécharger un fichier du Web (s'il a été modifié sur le serveur Web) et l'enregistrer localement afin qu'il puisse être utilisé par mon application.
Principalement, je veux implémenter ce que wget --timestamp <url>
Est-ce que.
Je ne sais pas ce qu'est wget, mais pour obtenir un fichier sur le Web et le stocker localement, vous pouvez utiliser NSData:
NSString *stringURL = @"http://www.somewhere.com/thefile.png";
NSURL *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData )
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"filename.png"];
[urlData writeToFile:filePath atomically:YES];
}
NSURLSession, introduit dans iOS 7, est la méthode recommandée par le SDK pour télécharger un fichier. Pas besoin d'importer des bibliothèques tierces.
NSURL *url = [NSURL URLWithString:@"http://www.something.com/file"];
NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
self.downloadTask = [self.urlSession downloadTaskWithRequest:downloadRequest];
[self.downloadTask resume];
Vous pouvez ensuite utiliser les méthodes de délégation NSURLSessionDownloadDelegate pour surveiller les erreurs, l'achèvement du téléchargement, la progression du téléchargement, etc. Il existe également des méthodes de rappel du gestionnaire d'achèvement de bloc en ligne, si vous préférez. Apple docs explique quand vous devez utiliser l'un sur l'autre.
Lisez ces articles:
Je voudrais utiliser un asynchrone accès en utilisant un bloc d'achèvement.
Cet exemple enregistre le logo Google dans le répertoire de documents du périphérique. (iOS 5+, OSX 10.7+)
NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentDir stringByAppendingPathComponent:@"GoogleLogo.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com/images/srpr/logo11w.png"]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (error) {
NSLog(@"Download Error:%@",error.description);
}
if (data) {
[data writeToFile:filePath atomically:YES];
NSLog(@"File is saved to %@",filePath);
}
}];
Je pense qu'un moyen beaucoup plus facile consiste à utiliser ASIHTTPRequest. Trois lignes de code peuvent accomplir cela:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"/path/to/my_file.txt"];
[request startSynchronous];
[~ # ~] update [~ # ~] : je devrais mentionner que ASIHTTPRequest n'est plus maintenu. L’auteur a spécifiquement conseillé aux utilisateurs d’utiliser un autre framework, comme AFNetworking
Il y a quelque temps, j'ai mis en place une bibliothèque "gestionnaire de téléchargement" facile à utiliser: PTDownloadManager . Vous pouvez tenter le coup!