从服务器下载文件一直失败,但相同的 obj-c 代码在另一个环境和 IOS 应用程序中工作

Posted

技术标签:

【中文标题】从服务器下载文件一直失败,但相同的 obj-c 代码在另一个环境和 IOS 应用程序中工作【英文标题】:Downloading a file from server keeps failing, but the same obj-c code works in another environment and IOS app 【发布时间】:2015-10-15 09:21:41 【问题描述】:

ios 版本是 9,Xcode 7 和以下代码不起作用。 但它适用于 IOS 版本 8、Xcode 6。

我正在使用以下代码从服务器下载文件:

 NSURLSessionConfiguration *configuration;
if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending) 
    configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"Test"];
 else 
    configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"Test"];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://hw13.asset.aparat.com/aparat-video/e361693675a47fa4ae758756b40a11653215108-360p__71758.mp4"]];
NSProgress *progress;

NSURLSessionDownloadTask *downloadTask =   [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) 
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

    NSString *fileAddress = [[appDelegate GetDocumentDirectory] stringByAppendingPathComponent:@"Myfile.mp4"];
    return [NSURL fileURLWithPath:fileAddress];

 completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) 
    if(error != nil)
        //ERROR
        [[NSFileManager defaultManager] removeItemAtPath:[filePath absoluteString]
                                                   error:nil];
        [progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL];
        [downloadTask cancel];
        return ;
    
    //SUCCESS
    [progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL];
];

[downloadTask resume];
[progress addObserver:self
           forKeyPath:@"fractionCompleted"
              options:NSKeyValueObservingOptionNew
              context:NULL];

不断报错:

Error Domain=NSURLErrorDomain Code=-1 "unknown error" UserInfo=NSErrorFailingURLKey=http://hw13.asset.aparat.com/aparat-video/e361693675a47fa4ae758756b40a11653215108-360p__71758.mp4, NSLocalizedDescription=unknown error, NSErrorFailingURLStringKey=http://hw13.asset.aparat.com/aparat-video/e361693675a47fa4ae758756b40a11653215108-360p__71758.mp4

这里是 GetDocuemntsD

-(NSString *)GetDocumentDirectory
self.fileMgr = [NSFileManager defaultManager];
self.homeDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
return self.homeDir;

*** 我可以将图像保存到文档目录,但我想在后台下载视频文件并向用户显示进度但总是失败。

我的 info.plist 有:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

【问题讨论】:

【参考方案1】:

iOS 9 在使用 HTTP 时添加了一些限制,您需要在 info.plist 文件中添加例外才能从 HTTP 下载。更多信息在这里: NSURLSession/NSURLConnection HTTP load failed on iOS 9

【讨论】:

我确实改变了我的 Plist。我可以从服务器下载图像,问题是我无法在后台下载视频 看看这个developer.apple.com/library/prerelease/ios/technotes/…【参考方案2】:

使用 iOS9,您必须检查您的 plist 文件并使用以下命令添加 ATS 设置:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

ATS 阻止对外部服务器的请求

【讨论】:

我确实改变了我的 Plist。我可以从服务器下载图像,问题是我无法在后台下载视频

以上是关于从服务器下载文件一直失败,但相同的 obj-c 代码在另一个环境和 IOS 应用程序中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何从 obj-c / ios 中的堆栈跟踪中获取源代码行

GitHub:克隆成功,但结帐失败

Swift 项目未构建

电脑一直安装不上Java,老提示下载失败

更新到 71.0 OSX 后,Firefox 下载随机失败

JSON 数据相同但程序失败?