7

私は を持ってNSURLSessionDownloadTaskbackgroundSessionConfigurationWithIdentifierます。画面をロックすると、次の例外が発生します。

エラー ドメイン = NSPOSIXErrorDomain コード = 1 「操作を完了できませんでした。操作は許可されていません。」.

このエラーは自分の電話でのみ発生し、他の電話では表示されません。

以下は簡単なコードです:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.edu.downLoadTest"];;
AFURLSessionManager *_session = [[AFURLSessionManager alloc] initWithSessionConfiguration:sessionConfiguration];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://podcasts.apple.com/apple_keynotes_hd/2015/2015_mar_hd_cc.m4v"]];

NSProgress *progress;
NSURLSessionDownloadTask *task1 = [_session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSString *a =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    return [NSURL fileURLWithPath:[a stringByAppendingPathComponent:@"test.m4v"]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"%@",error);
}];


[task1 resume];
4

2 に答える 2

7

最近、同じ問題に遭遇しました。ユーザーがパスワードを持っているためにロックされるキャッシュディレクトリ内のファイルに応答が保存されることがわかりました。セッションを作成する前に、アプリのどこかでこれを実行する必要があります。

  NSString* path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    path = [path stringByAppendingPathComponent:@"Caches/com.apple.nsurlsessiond/Downloads"];


    NSString *appInfoPlist = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
    NSDictionary *dictionary = [[NSDictionary alloc]initWithContentsOfFile:appInfoPlist];

    path = [path stringByAppendingPathComponent:dictionary[@"CFBundleIdentifier"]];
    [[NSFileManager defaultManager] setAttributes:@{NSFileProtectionKey: NSFileProtectionCompleteUntilFirstUserAuthentication} ofItemAtPath:path error:nil];
于 2015-09-28T11:03:38.277 に答える