it-swarm.com.de

Wie lade ich eine Datei unter iOS mit Ziel C herunter und speichere sie lokal?

Ich bin neu in Objective-C und möchte eine Datei aus dem Web herunterladen (falls sie auf dem Webserver geändert wurde) und lokal speichern, damit sie von meiner Anwendung verwendet werden kann.

Hauptsächlich möchte ich umsetzen, was wget --timestamp <url> tut.

41
bogdan

Ich bin mir nicht sicher, was wget ist, aber um eine Datei aus dem Web abzurufen und lokal zu speichern, können Sie NSData verwenden:

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 wurde in iOS 7 eingeführt und ist die empfohlene SDK-Methode zum Herunterladen einer Datei. Es müssen keine Bibliotheken von Drittanbietern importiert werden.

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

Sie können dann die Delegatmethoden NSURLSessionDownloadDelegate verwenden, um Fehler zu überwachen, den Download abzuschließen, den Downloadfortschritt usw. Es gibt auch Rückrufmethoden für die Inline-Blockvervollständigung, wenn Sie dies vorziehen. In den Apples-Dokumenten wird erklärt, wann Sie eine über der anderen verwenden müssen.

Lesen Sie diese Artikel:

objc.io NSURLConnection to NSURLSession

RL Loading System Programming Guide

15
bandejapaisa

Ich würde einen asynchronen Zugriff unter Verwendung eines Abschlussblocks verwenden.

In diesem Beispiel wird das Google-Logo im Dokumentverzeichnis des Geräts gespeichert. (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

Ich denke, eine viel einfachere Möglichkeit ist die Verwendung von ASIHTTPRequest. Drei Codezeilen können dies erreichen:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"/path/to/my_file.txt"];
[request startSynchronous];

Link zur Referenz

[~ # ~] Update [~ # ~] : Ich sollte erwähnen, dass ASIHTTPRequest nicht mehr gepflegt wird. Der Autor hat ausdrücklich empfohlen, stattdessen ein anderes Framework zu verwenden, wie AFNetworking

6
pixelfreak

Vor einiger Zeit habe ich eine benutzerfreundliche "Download Manager" -Bibliothek implementiert: PTDownloadManager . Sie könnten es versuchen!

1
Ali

Es gibt so viele Möglichkeiten:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget , eine kommerzielle Version mit leistungsstarken Funktionen.

0
johnson