无权读取 iCloud Drive 文件

fis*_*ear 3 ios icloud-drive

我试图让我的应用程序能够打开 iCloud Drive 文件,当用户点击 Apple“文件”应用程序中的文件并选择我的应用程序以查看它时。一切都设置得很好,这样应用程序被打开,并在用户点击文件时通知。但是无法打开该文件,错误是该应用程序无权这样做。

我的应用程序将“支持打开文档到位”Info.plist设置为“是”。这意味着 URL 指向应用程序外部的 iCloud 目录,这可能是问题的原因。如果我将其设置为 NO,则 URL 是应用程序内文件的副本,并且一切正常。但该应用程序需要该设置为 YES。

我已经验证过,该文件实际上存在于手机上。

有谁知道如何使这项工作?

我的openURL:方法目前看起来像:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    NSLog(@"path=%@", url);
    NSError *error = nil;
    NSData *data = [[NSData alloc] initWithContentsOfURL:url options:0 error:&error];
    NSLog(@"error=%@", error);
}
Run Code Online (Sandbox Code Playgroud)

给出的错误是:

错误域=NSCocoaErrorDomain 代码=257“无法打开文件“Kili.gpx”,因为您没有查看它的权限。UserInfo={NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Kili.gpx, NSUnderlyingError=0x283ac83f0 {Error Domain=NSPOSIXErrorDomain Code=1“不允许操作”}}

fis*_*ear 6

我找到了解决方案。你需要用startAccessingSecurityScopedResource和包围 url 的阅读stopAccessingSecurityScopedResource

[url startAccessingSecurityScopedResource];
NSError *error = nil;
NSData *data = [[NSData alloc] initWithContentsOfURL:url options:0 error:&error];
[url stopAccessingSecurityScopedResource];
Run Code Online (Sandbox Code Playgroud)