无权读取iCloud Drive文件

7
我想让我的应用程序能够在用户在苹果的“文件”应用中点击文件并选择我的应用程序查看时打开iCloud Drive文件。一切都设置好了,以至于当用户点击文件时,应用程序会被打开并得到通知。但是无法打开文件,因为出现了没有权限的错误。
我的应用程序在Info.plist中将“支持原地打开文档”设置为YES。这意味着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);
}

报错信息如下:

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

1个回答

11

我找到了解决方法。您需要使用startAccessingSecurityScopedResourcestopAccessingSecurityScopedResource来包围读取URL的过程:

[url startAccessingSecurityScopedResource];
NSError *error = nil;
NSData *data = [[NSData alloc] initWithContentsOfURL:url options:0 error:&error];
[url stopAccessingSecurityScopedResource];

fishinear,你在我的心中已经达到了传奇的地位,至少对于我来说是这样。非常感谢你的发布! - Cirec Beback
fishinear,你在我的心目中已经成为传奇人物了,因为你发布了这个。非常感激! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接