2017-11-22 41 views
1

iOS 11のファイルアプリからローカルアプリのサンドボックスにファイルをコピーしたいとします。テスト目的のために、ファイルがファイルアプリ(iCloudからローカルストレージにダウンロード)でローカルに利用可能であると仮定します。ファイルの拡張子は、私のアプリに登録され、ファイルがファイルアプリケーションに押されたときに私のアプリは、ファイルアプリからファイルのURLを受信します。ファイルをiOS 11からファイルをサンドボックスにコピー

NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 

NSURL *nsUrl; // comes from Files app. For instance "file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/test.rar" 
NSURL *targetUrl; // file in my app's document directory 

NSError *coordinatorError = nil; 
[fileCoordinator coordinateReadingItemAtURL:nsUrl options:NSFileCoordinatorReadingWithoutChanges error:&coordinatorError byAccessor:^(NSURL *newURL) 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    //if ([fileManager fileExistsAtPath: [nsUrl path]]) 
    { 
     NSLog(@"Copy from %@ to %@", newURL, targetUrl); 

     NSError *copyError = nil; 
     [fileManager copyItemAtURL:newURL toURL:targetUrl error:&copyError]; 
     if (!copyError) 
     { 
      // OK 
     } 
     else 
     { 
      NSLog(@"Files app error: %@", copyError); 
     } 
    } 
}]; 

しかし操作は、この出力で失敗します。

2017-11-22 09:30:28.685127+0100 test[434:40101] Copy from file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/test.rar 
to file:///var/mobile/Containers/Data/Application/01BB33E6-2790-0FD0-8270-000/Documents/test.rar 
2017-11-22 09:30:28.687174+0100 test[434:40101] Files app error: Error Domain=NSCocoaErrorDomain Code=257 "The file “test.rar” couldn’t be 
opened because you don’t have permission to view it." 
UserInfo={NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/test.rar, 
NSUnderlyingError=0x1c084abf0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}} 

外部ファイルへの読み取りアクセスを得るために特別なものがありますか?

よろしく、

答えて

0

ソリューション:

[nsUrl startAccessingSecurityScopedResource] 

と 以前のコードでこれを入れてください[NSURL stopAccessingSecurityScopedResource]

+0

? – Matt

+1

'' coordinateReadingItemAtURL''ブロック内に置くことができます。終了したら、 '' stopAccessingSecurityScopedResource ''を呼び出すことを忘れないでください。 – Hyndrix

+0

あなたの答えをより明確にしてください。 – Matt