iCloud详解——文档存储(2)

大家好,我是指北君,作为iCloud系列文章,本篇接上一篇内容继续为大家介绍文档存储的相关技术。

前言

使用iCloud的文档存储可以让应用支持文档的同步能力:用户可以通过iCloud账户在所有的设备使用应用文档。

通过文档协调器(NSFileCoordinator),应用的文档自动实现多端设备的同步能力。处理iCloud文档时,必须使用文件协调器和演示者。

应用要求

  1. 自动保存。应用必须开启自动保存才能使用iCloud。
    通过注册NSUndoManager或调用UIDocument.updateChangeCount方法启用自动保存。
    监控文档位置,应用需要实现同步所需的移动、重命名或删除。某些情况应用如果持有文档路径,需要在访问前判断文档是否存在。

  2. iOS需要时主动下载文件。iOS不会自动下载云端的文档,新的文档需要应用主动下载。
    对于未下载到本地化的文件(或文件包),开发者可以在用户请求下载之前明确启动下载;如果文件数量很少,并且每个文件本身相对较小,可以主动下载元数据关联的所有文件。

  3. 根据需要处理文档版本冲突。当在两个不同设备上运行的应用同时更改文档时,就会发生冲突。例如,如果两个设备未连接到网络,用户对它们进行更改,然后将两个设备重新连接到网络,就会发生这种情况。NSFileVersion对象将冲突报告给应用,应用可以根据NSFileVersion对象和文档的元数据等来确定如何解决冲突。
    应用可以接受建议的版本或指定不同的版本,应用也可以让用户决定使用何种版本
    解决版本冲突过程中,可能多台设备都在进行,所以需要注意并发问题。
    解决冲突后,需要删除所有过时的文档版本,不然将占用用户控件。

  4. 避免由模态UI元素导致的死锁。

  5. 始终使用文件协调器访问iCloud文件或文件包。
    应用程序在操作文档的底层文件时(移动、重命名、复制或删除)必须明确使用文件协调器

  6. 不要让用户无意间共享信息。

文档格式

应用采用的文档格式将会影响应用文档的网络传输性能,比如,如果应用需要实现增量的变更同步,那么文件格式就需要使用文件包。

传输效率

如果应用采用的文档数据格式由多个不同的部分组成,那么最好使用文件包。文件包格式呈现给用户还是单个文件,但是实际上是有由一个通过文件夹包含的多个文件组成,通过NSFileWrapper可以访问文件包对象,iCloud上传和下载机制利用了文件包中的这种内容分散特性实现变更内容的增量同步,包含增量下载和增量上传。

结构

文档状态持久化

许多基于文档的应用为提升用户体验需要记录每个文档的状态。例如,基于绘图应用需要记录最近使用的绘图工具和绘图的元素。
有两中方式存储文档的这种状态信息:

  1. 在文档或者文档包中存储,这种情况适合用户需要在多台设备上共享状态信息。
  2. 在文档之外关联文档中存储,这种情况适合于不希望在多设备上共享状态的场景。

无论哪种方案,只有当编辑了文档内容时,才保存状态信息,不然会导致频繁的数据同步和非必要的文档冲突。

示例:用户在iPad上编辑一个长文本文档,在第1页上工作。稍后,他在iPhone上打开该文档并滚动到最后一页。如果不好的实现将浏览位置保存并上传同步,就会导致当用户稍后在iPad 上打开文档以恢复编辑时,因为在iPhone上滚动位置的状态数据而产生不必要的冲突版本。

文档的状态包含下面多种情况,在设计时都需要仔细考虑:

  • 文档滚动位置
  • 元素选择
  • 最后打开的时间戳
  • 表排序顺序
  • 窗口大小

兼容性

在为iCloud设计文档文件格式时,要注意以下因素

  • 采用跨平台数据表示
  • 考虑平台特定的坐标系
  • 使用格式版本号

流程

文档存储的使用流程如下: 使用流程

iCloud Drive中使用文档存储

如果要在iCloud Drive中启用文档存储需要添加相应的秘钥信息。以及指定应用的容器:

1
2
3
4
5
6
7
8
9
10
11
12
    <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的文档存储就讲完了,本次主要介绍文档存储在使用时的要求,文档存储相关的文档状态持久化如何处理,以及文档存储在跨平台时要考虑哪些兼容性要素,最后给出使用文档存储的流程。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。