将文件从 iOS 11 Files 应用程序复制到沙箱

Posted

技术标签:

【中文标题】将文件从 iOS 11 Files 应用程序复制到沙箱【英文标题】:Copy file from iOS 11 Files app to sandbox 【发布时间】:2018-05-05 22:17:32 【问题描述】:

我想将文件从 ios 11 文件应用程序复制到我的本地应用程序沙箱。出于测试目的,假设文件在文件应用程序中本地可用(从 iCloud 下载到本地存储)。文件扩展名已在我的应用程序中注册,当在文件应用程序中按下文件时,我的应用程序会从文件应用程序接收文件 URL:

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"

获得对外部文件的读取权限是否需要一些特殊的东西?

问候,

【问题讨论】:

【参考方案1】:

以下是访问文件并在完成后停止的方法。

//To gain access
[nsUrl startAccessingSecurityScopedResource]

//To stop access
[nsUrl stopAccessingSecurityScopedResource]

【讨论】:

您可以将其放在coordinateReadingItemAtURL 块中。完成后不要忘记调用“stopAccessingSecurityScopedResource”。【参考方案2】:

我在将文件从 iOS 11 文件应用程序复制到沙盒时遇到同样的问题。最后我解决了我的问题这个链接 check here

和示例代码。

[fileURL startAccessingSecurityScopedResource];//fileURL ---> Which FileURL you want to copy

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

                NSFileAccessIntent *readingIntent = [NSFileAccessIntent readingIntentWithURL:fileURL options:NSFileCoordinatorReadingWithoutChanges];

                [fileCoordinator coordinateAccessWithIntents:@[readingIntent] queue:[NSOperationQueue mainQueue] byAccessor:^(NSError *error) 

                    NSData *filePathData;

                    if (!error)
                    
                        // Always get URL from access intent. It might have changed.
                        NSURL *safeURL = readingIntent.URL;

                     // here your code to do what you want with this 

                    

                    [fileURL stopAccessingSecurityScopedResource];

                ];

【讨论】:

以上是关于将文件从 iOS 11 Files 应用程序复制到沙箱的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件从 iOS 反应原生应用程序保存到 Files 文件夹

sh 将文件从files目录复制到所有三个存储桶

使用 PhoneGap 将文件从 www 复制到“文档”

是否可以使用 Expo 将文件写入 iOS 文件系统,以便可以通过 iOS 11 Files 应用程序访问它

是否可以使用 Expo 将文件写入 iOS 文件系统,以便可以通过 iOS 11 Files 应用程序访问它

iOS11 在 Files 应用中保存并查看 .txt 文件