阅读 205

iCloud-Documents存储

往期文章

寻找IOS相册中相似图片
NSNotification与类对象,实例对象

iCloud存储简介

iCloud云端存储分为三大块key-value,documents,cloudKit,每个app对应自己独立的存储空间,互相不能发现,只能在iphone设置里面,找到对应的存储空间。如果app删除,对应的存储空间不会自己删除,需要在iphone设置里面找到并且删除。类似于远端沙盒系统。

iCloud-key-value仅适用于保存小数据,如用户偏好、系统设置和一些简单的App状态。每个App每个用户总共最多可存储1MB数据,key的最大数量是1024,每个key的最大长度是64Bytes,每个key最大可以存储1MB的value。

CloudKit类似于SQL数据库,可以通过CoreData将数据存入iCloudKit。

下面重点来讲解下今天的主角iCloud Documents存储

iCloud-Documents

工作原理

沙盒系统和iCloud容器在IOS系统中是分属文件系统两个不同的区域,与沙盒系统不一样的是iCloud容器需要进行提前配置才能使用。

  1. 首先我们使用事先申请好的容器ID,调用 NSFileManager 的 URLForUbiquityContainerIdentifier。让系统配置好容器

  2. 系统在配置好容器之后,将文件的操作URL给app

  3. app通过返回的URL,构建更多 URL 以指定文件和目录,并使用该 URL 创建元数据查询以搜索容器

image.png

传输步骤

iCloud Container与iCloud云端之间的文件传输是增量式的,在首次上传之后,之后的修改都会基于第一次的上传的数据来进行更改。下载同理

文档的首次上传

第一步先发送元数据,包括文档名称,修改日期,大小,文件类型,此元数据传输很快发生
第二步icloud会发送文档数据,也就是二进制数据,上一步发送的文档数据可让icloud迅速知道新文件的位置。

image.png

第二次上传 对于同一文件的第二次上传或者修改(增量上传)

将文档的数据存储在服务器上后,iCloud会优化将来与设备之间的传输。iCloud不会每次更改时都发送整个文件或文件包,而是仅发送元数据和已更改的片段。图3-3直观地显示了此增量式上载。和以前一样,系统会先发送文件元数据,以便iCloud可以将其传播到其他设备。发送元数据后,系统仅上载文档更改的部分。此优化减少了iCloud网络流量,并减少了设备消耗的电量。您可以通过设计支持增量传输的文件格式来帮助优化,如网络传输效率设计中所述。

image.png

文档首次下载

当新文件出现在iCloud中时,该文件必须下载到用户的其他设备上,如图3-4所示。对于每个设备,iCloud首先发送该文档的元数据,以便设备知道文件的存在。之后,检索文件数据的时间取决于设备的类型。在iOS中,应用程序必须要求系统(显式或隐式)下载文件。您可以尝试通过使用NSFileCoordinator类中的方法访问该文件来隐式下载文件,也可以通过调用该startDownloadingUbiquitousItemAtURL:error:方法中的方法来 显式下载文件。NSFileManager班级。Mac在服务器上检测到文件后便会自动下载文件。因此,Mac有时被称为“贪婪的对等体”。如果您的Mac应用程序看到新文档的元数据,但是该文档本身还不是本地文档,则系统可能已经代表您的应用程序下载了该文档。

image.png

第二次下载 对于同一文件的第二次下载或者修改(增量下载)

首次下载文件内容后,后续操作仅下载文件更改的部分,如图3-5所示。与所有传输一样,传输过程的第一步是下载文件的更新文档元数据。收到元数据后,设备会在适当的时间自动提取更改。在iOS设备上,更改会在适当的时间进行,例如拥有文件的应用程序出现在前台。在OS X中,更改将被立即拉出

image.png

操作方法

UIDocument

作用

使用UIDocument及其底层体系结构的应用程序可从其文档中获得许多好处: 异步读取和写入后台队列中的数据。因此,在进行读写操作时,您的应用程序对用户的响应能力不会受到影响。 自动与云服务集成的文档文件的协调读写。 支持发现文档的不同版本之间的冲突(如果发生)。 首先将数据写入临时文件,然后用它替换当前文档文件,以安全地保存文档数据。 适时自动保存文档数据;此机制包括对处理暂挂行为的支持。 在“模型-视图-控制器”设计模式中,UIDocument对象是模型对象或模型控制器对象-它管理文档的数据或共同构成文档数据的聚合模型对象。通常,您可以将其与视图控制器配对,该视图控制器管理呈现文档内容的视图。 UIDocument不支持管理文档视图。 基于文档的应用程序包括那些可以生成多个文档的应用程序,每个文档都有其自己的文件系统位置。基于文档的应用程序必须为其文档创建UIDocument的子类。有关详细信息,请参见下面的“子类化注释”。

使用方法

创建新的Document
saveToURL:forSaveOperation:completionHandler:。
复制代码
打开现有Document
openWithCompletionHandler:
复制代码
编辑Document

在用户编辑时,跟踪对文档的更改。 UIDocument会定期记录未保存的更改,并将文档数据写入其文件。

关闭Document

在文档实例上调用closeWithCompletionHandler:。如果有任何未保存的更改,UIDocument将保存文档。

UIDocument 文件读写调用顺序

创建或者写入一个新的文件

先调用saveToURL这个方法,并且传入保存文件路径,以及保存方法,回调是否成功

[self saveToURL:self.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        
        block(success);
    }];
复制代码

然后调用contentsForType来构造,需要保存文件的形式

- (id) contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError 
复制代码

最后完成创建工作

读取一个文件

先调用openWithCompletionHandle这个方法,来打开文件

[doc openWithCompletionHandler:^(BOOL success) {
        
        if (success) {
            NSLog(@"打开成功");
        } else {
            
            NSLog(@"打开失败");
        }
    }];
复制代码

然后会触发UIDocument的loadFromContents方法 数据将会在loadFromContents中返回

- (BOOL) loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError
复制代码

功能列表

实现功能相关方法简介
创建一个新的标准文档UIDocument使用文档对象以您的文档格式创建和管理数据结构。文档类自动支持将新文档保存到iCloud容器或本地存储中。
创建一个CoreData数据文档UIManagedDocument使用Core Data文档子类来创建和管理您的Core Data存储。有关详细信息,请参阅在iCloud中设计Core Data。
获取iCloud文档的URLNSMetadataQuery在iOS中,使用元数据查询对象来查找和获取有关iCloud文档的实时更新的信息
提示用户打开文档。Custom UI (iOS)Automatic as part of the document在iOS中,您的应用程序直接负责以简单,简洁的方式为用户文档提供选择UI,该用户界面非常适合应用程序设计的其余部分。
处理版本冲突UIDocument, NSFileVersion (iOS)在iOS中,文档会检测并通知您有关冲突的信息。根据需要使用NSFileVersion对象(文档的每个修订版本一个)来解决它们。
移动,复制和删除基于iCloud的文档NSFileCoordinator NSFileManager使用NSFileManager类处理磁盘上的文件,并且始终在文件协调器对象的上下文内。

使用iCloudDrive共享应用空间

需要在应用的plist文件中加入如下字段,来声明该容器是公开的能被外部访问的

<key>NSUbiquitousContainers</key>
    <dict>
        <key>iCloud.com.example.MyApp</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
            <key>NSUbiquitousContainerName</key>
            <string>MyApp</string>
        </dict>
    </dict>
复制代码

设置完毕之后,就可以看到在本机文件系统中的iCloud Drive目录下有一个APP的共享云盘目录。 31623294269_.pic.jpg

文章分类
iOS
文章标签