web-dev-qa-db-fra.com

Comment télécharger et enregistrer un fichier localement sur iOS à l'aide de l'objectif C?

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.

41
bogdan

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];
}
147
Henning

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:

objc.io NSURLConnection to NSURLSession

Guide de programmation du système de chargement d'URL

15
bandejapaisa

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);
    }
}];
14
Tibidabo

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];

Lien vers référence

[~ # ~] 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

6
pixelfreak

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!

1
Ali

Il y a tellement de façons:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget , un logiciel commercial doté de puissantes fonctionnalités.

0
johnson