NSFileWrapper 从 iCloud 失败并从本地目录工作

Posted

技术标签:

【中文标题】NSFileWrapper 从 iCloud 失败并从本地目录工作【英文标题】:NSFileWrapper fails when from iCloud and works from local directory 【发布时间】:2013-02-02 15:53:10 【问题描述】:

我在将 NSFileWrapper 文档与 iCloud 同步时遇到问题。我能够创建我的包装器并将其保存到我无处不在的容器中。

当我尝试从创建它的设备中读取它时,它可以工作。当我尝试从另一台从 iCloud 获取数据的设备上读取数据时,它崩溃了。

一些代码:

这个函数添加一个带有 NSString 的包装容器

- (void) addNSString:(NSString*)_string toFileWrapper:(NSFileWrapper*)_wrapper forKey:(NSString*)_key 

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_string];

    if(data) 

        [_wrapper addRegularFileWithContents:data preferredFilename:_key];
    

然后是我如何解码它:

- (id) unarchiveObjectFromWrappers:(NSDictionary*)_wrappers withKey:(NSString*)_key 

    id value = nil;

    NSFileWrapper *wrapper = [_wrappers valueForKey:_key];
    if(wrapper) 

        NSData *data = [wrapper regularFileContents];

        if(data) 

            value = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        
    

    return value;

解码部分在一台设备上工作,而不在其他设备上工作(当 NSKeyedUnarchiver 尝试从 NSData 取消归档时,EXC_BAD_ACCESS。NSData 看起来不错,它具有适当的长度和所有内容,但是当我尝试记录其数据时,例如它崩溃)。

我的猜测是 NSFileWrapper 不下载它的全部内容,只下载它的结构,并且我必须做一些事情来使它可用。但我不知道是什么。

有什么想法吗?

========

编辑:

NSURLUbiquitousItemIsDownloadedKey 表示文件已下载,但如果我尝试将其复制到沙箱,则会失败并出现以下错误:“操作无法完成。文件描述符错误”

所以文件要么没有正确上传到 iCloud,要么没有正确下载...

【问题讨论】:

如果我尝试使用 NSFileManager 读取无处不在的容器(iCloud Documents 文件夹),我将面临类似的问题。如果我在运行 NSMetadataQuery 后访问它,我可以访问这些文件。所以我猜,你直接用 NSFileManager 访问文件? Thomas,也许这就是你的情况:***.com/questions/8714525/… 【参考方案1】:

这也让我发疯了。该解决方案相当简单,但 Apple 完全没有记录。您必须专门下载该文件。只有文件包装器会自动下载,但不会自动下载其内容。这就是检查显示文件存在的原因。

在复制文件之前,调用如下代码:

[[NSFileManager defaultManager]startDownloadingUbiquitousItemAtURL:cloudURL error:nil];

相关:Cannot sync simple text file with iCloud (bad file descriptor)

【讨论】:

以上是关于NSFileWrapper 从 iCloud 失败并从本地目录工作的主要内容,如果未能解决你的问题,请参考以下文章

我们可以确定 iCloud 文件包中发生了啥变化吗?

cURL Apple iCloud 日历订阅链接失败

iOS 从iCloud中获取文件

在 iOS9 中使用 UIImagePickerController 获取 iCloud 项目失败

使用 AudioToolBox 将 Wave 文件保存到 NSFileWrapper

NSFileWrapper 错误写入 URL