Подтвердить что ты не робот

Как загрузить и сохранить файл локально на iOS с помощью объектного C?

Я новичок в Objective-C, и я хочу загрузить файл из Интернета (если он был изменен на веб-сервере) и сохранить его локально, чтобы он мог использоваться моим приложением.

В основном я хочу реализовать то, что делает wget --timestamp <url>.

4b9b3361

Ответ 1

Я не уверен, что такое wget, но чтобы получить файл из Интернета и сохранить его локально, вы можете использовать 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];
}

Ответ 2

Я бы использовал асинхронный доступ с помощью блока завершения.

В этом примере сохраняется логотип Google в каталоге документа устройства. (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);
    }
}];

Ответ 3

NSURLSession, представленный в iOS 7, является рекомендуемым способом загрузки файла в SDK. Нет необходимости импортировать сторонние библиотеки.

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

Затем вы можете использовать методы делегирования NSURLSessionDownloadDelegate для отслеживания ошибок, завершения загрузки, выполнения загрузки и т.д. Есть также встроенные методы обратного вызова обработчика блоков, если вы предпочитаете. Яблоки docs объясняют, когда вам нужно использовать один над другим.

Прочитайте эти статьи:

objc.io NSURLConnection для NSURLSession

Руководство по программированию URL-адреса URL

Ответ 4

Я думаю, что гораздо проще использовать ASIHTTPRequest. Три строки кода могут выполнить это:

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

Ссылка на ссылку

ОБНОВЛЕНИЕ. Я должен упомянуть, что ASIHTTPRequest больше не поддерживается. Автор специально рекомендовал людям использовать другую структуру, например AFNetworking

Ответ 5

Когда-то я реализовал простую в использовании библиотеку "диспетчер загрузки": PTDownloadManager. Вы можете дать ему шанс!

Ответ 6

Существует так много способов: