I've recently updated to AFNetworking 2.0. The documentation said it is compatible with iOS6.0+. I am building a iOS 6.0 app, when I am trying to implement a download method (both images and videos). The example use
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
However, I got an "Use of undeclared identifier 'AFURLSessionManager'" error. And I found out that AFURLSessionManager use a class that is only available from iOS7. I'm just wondering, who could I download in iOS6 using AFNetworking?
Also, is there anyway to see download progress?
Thank you
As you say AFURLSessionManager
is only available in iOS 7(is backed by NSURLSession
), so you should use the NSURLConnection
based classes in AFNetworking 2.0 (AFHTTPRequestOperationManager
, AFHTTPRequestOperation
, etc).
You can use the AFHTTPRequestOperation
class to perform a file download on iOS 6. You basically just need to set the operation's outputStream
property to store the file and the downloadProgressBlock
property to monitor the progress.
The bare bones method below is declared in a class that is a subclass of AFHTTPRequestOperationManager
. When I initialized an instance of this class I set up the baseURL
property.
- (AFHTTPRequestOperation *)downloadFileWithContentId:(NSString *)contentId destination:(NSString*)destinationPath {
NSString *relativeURLString = [NSString stringWithFormat:@"api/library/zipped/%@.zip", contentId];
NSString *absoluteURLString = [[NSURL URLWithString:relativeURLString relativeToURL:self.baseURL] absoluteString];
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:absoluteURLString parameters:nil];
void (^successBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^void(AFHTTPRequestOperation *operation, id responseObject) {
};
void (^failureBlock)(AFHTTPRequestOperation *operation, NSError *error) = ^void(AFHTTPRequestOperation *operation, NSError *error) {
};
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:successBlock failure:failureBlock];
NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:destinationPath append:NO];
operation.outputStream = outputStream;
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
}];
[self.operationQueue addOperation:operation];
return operation;
}
try this...
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
AFHTTPRequestOperation *operation = [manager GET:urlString
parameters:nil
success:^(AFHTTPRequestOperation *operation, NSData *responseData)
{
[responseData writeToURL:someLocalURL atomically:YES];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Downloading error: %@", error);
}];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
{
float downloadPercentage = (float)totalBytesRead/(float)(totalBytesExpectedToRead);
[someProgressView setProgress:downloadPercentage animated:YES];
}];