将文件从 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:©Error];
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 文件夹
是否可以使用 Expo 将文件写入 iOS 文件系统,以便可以通过 iOS 11 Files 应用程序访问它