大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 macOS 上的 FileProvider 将文件同步到云端
了解如何使用 FileProvider 框架来构建全面的云同步解决方案。我们将向您展示如何着手构建文件提供程序扩展,探索如何轻松将您的扩展与安全保存、磁盘空间管理、查找器集成等文件系统功能集成。
资源
相关视频
Tech Talks
-
下载
♪ ♪ 大家好 我是云端文件供应团队的 约翰尼斯福特曼 今天我们一起来看看 macOS的FileProvider 如果你是云端存储供应商 需要将用户文件同步到macOS 那你就来对地方了 等等介绍完之后 我们会讨论到 一些同步文件的用户流程 我们将实行Xcode中的一个流程 并讨论你支持的 流程顺序 我们来快速看一下 额外可选的集成点 还有后续步骤 首先 我们先来谈谈文件供应 可以为你做什么
文件供应框架能让您集成 云端存储空间到macOS的文件系统 使用新APFS功能 按需求下载用户文件和文件夹 API完全是用户的空间 我们要准备舍弃macOS的内核扩展 因此如果你是依赖用户空间文件系统 或是KAUTH 来拦截系统调用或是按需求下载文件 这会是一个不错的选择
你只需要处理上传 下载及远程告诉我们变化 系统就会告诉你哪里有部分改变 并处理剩下的 所有功能都已经与系统整合 尤其是在Finder中 Provider会显示在侧栏 文件状态会在Finder中显示及追踪 并且还有几个可自定义的 UI集成点 你执行与系统集成的 应用程序扩展程序 它的生命周期是由用户操作驱动 一开始 你创建一个域 在目录树中的用户 可以进到你的云端空间 系统会在Finder侧栏中 公开该域并在文件系统中 创建根目录 这时 设备上是没有实际数据的 但用户已经可以与根互动 这是怎么发生的? 根就是所谓的无数据目录 在APFS算新角色 API可以辨识并与它们互动 更重要的是 无数据对象 对已经发生在它们身上的过程 完全不知情 读取会触发下载 文件在被允许读取前 会失去无数据属性 在这次演示中 我们将看到文件供应框架 是如何允许无数据文件在读取过程中 执行回调函数 我们来看看一些用户流程的 启动和执行同步 我们将查看涵盖上下同步的 四个关键流程 在每一流程中可以看到系统 当需要新数据时会调用你的扩展程序
你可以向你的云端服务器 要数据 最后 回报完成处理程序 首先 当无数据文件被读取时 先来看看会发生什么事情
当内核侦测到无数据文件的 读取途径时 系统调用将会暂停 同时间你的扩展程序将被调用来 取得文件内容 fetchContent扩展程序方法被调用了 正常来说 执行它来下载 下载完成后 会通知completionHandler 文件内容会被交给系统 系统会在不打开文件描述符 无效的情况下 填补过去无数据的文件 然后系统会暂停读取途径 现在文件不再是无数据的 后续读取也不会涵盖你的扩展程序 枚举目录的运作方式也很相同 内核侦测到读取目录函数调用 并暂停它 它会调用你的扩展程序去枚举 目录中的项目 你从服务器中取得这些项目的元数据 然后回复一些项目 枚举是有分页的 你可以回复较少完整的项目集 系统将会 从它停止的地方开始枚举 枚举完所有页面后 系统将允许原始调用通过 像是文件的例子中 一旦目录枚举好 后续读取目录函数调用将使用 磁盘中的内容 且不涉及到你的扩展程序
但如果那些内容远程更改该怎么办? 那你就必须通知系统远程更改 来看看它是怎么运作的 如果有远程更改 你的服务器可以发推送通知到Mac 响应推送通知 你向系统发出信号说 一个特别的枚举器the .workingSet 需要更改 系统会反过来枚举 在the.workingSet.中有改变的项目 一个称为syncAnchor的延续令牌 在枚举上仅用于新改变 这个令牌是由你的扩展程序定义 系统会追踪 上次枚举的syncAnchor 它将使用enumerateChanges方法 调用你的枚举器 然后你返回更改项目 完成后 记得跟我们说 新的syncAnchor 这样我们下次就可以使用 系统将异步更新 用户可见文件 我们使用APFS比较和交换功能 确保本地更改 并未在过程中遗失 此外 系统整合 文件协调及其他 建议锁机制 与应用程序协调
有了这三个机制 我们能够 从云端同步文件 并在远程更改时依旧能保持同步 最后流程处理将本地更改同步到云端 系统侦测到本地项目更改 在扩展程序上调用modifyItem方法 传送到已更改的确切字段集 它将低层事件集成 对同步有意义的事件 例如 内核侦测到安全保存 项目标识符透明地转换到新文件ID 如果请求系统压缩包文件 还有提供一致级别更改
针对modifyItem调用的反应 你将更新服务器端项目的状态 如果文件内容有变化 系统会给你一个更改过的副本 这样即便你有做更改 也可以上传一致的版本
完成后 调用completionHandler 它是用来更新项目的版本辨识符 还有确认更改交付 到你的扩展 completionHandler会把项目最终状态 作为参数 在云端中更新项目可能会改变其状态 像是与远程更改有所冲突 由于你传回最终状态 系统就能够更新项目的本地状态 来匹配云端中的真实性
还有第五流程:驱逐 只要磁盘空间有任何迫切需求 在不涉及文件供应扩展的状况下 系统会自动驱逐本地文件 像以下情况可能会发生 当用户在录制视频 或是下载软件更新时 系统会逐出最近 最不常使用到的文件集 来写入新文件的磁盘空间 让我们看一下转变模式 驱逐将本地文件转换成无数据文件 而下载时则将无数据文件 转换成本地文件 无论是不是远程创建 只要是本地创建的 就可以无数据启动 但并非所有文件都可以被驱逐 系统只会驱逐 你报告为已上传的文件 以便可以再次下载 所以有两种本地文件 上传及非上传文件 在本地编辑后 新版本文件 需要再次被上传 这样才会变成非驱逐状态
介绍到这里 我们已经看到文件供应扩展程序 是如何被系统调用以下载文件 并在本地编辑后下载文件 就算没有参与 磁盘压力触发驱逐 但仍有些方法可以触发 或是防止从你的扩展程序驱逐
这就有很大的学问了 我们实际来看一个流程好了
我们写了个应用程序 来运作一个小型本地文件服务器 嵌入一个 针对该服务器运行的 文件供应扩展程序 叫FruitBasket 我已经登入该服务器 所以在侧边栏中会有一个 根文件夹的条目 我还选择了根文件夹 导致系统在该文件夹的项目 做了无数据条目 你可以通过文件名字旁的 云端下载图示 分辨哪些项目是无数据的
我们在命令行上使用“猫” 来读取文件 因为文件是无数据的 在扩展程序中造成内容提取 我已经在Xcode中附加到扩展程序 然后设置一个断点来拦截这个内容
猫正在运行 我们的断点已命中 由于我们阻挡了 获取内容的完成度 我们终端窗口的读取也被阻挡了 请注意在Finder窗口中 云端图标已被进度指示器取代 系统有下载状态的一致视图 当然 我们也实际在调适软件阻挡 而非忙于下载 因此进度不会更新
再来 在调用completionHandler前 我已经设置了第二个断点
这次我们的provider已经 将文件内容下载到本地URL的磁盘上 一旦我们调用completionHandler 系统会将用户可见文件的内容 替换成我们下载的内容 试试在Xcode解锁系统 Finder状态更新显示文件为本地 而且“猫”成功被阻止读取
我一样设置了断点 但现在的文件是本地的 我可以在不会碰到断点时运行“猫” 这些读取与常规本地文件背道而驰 不涉及到扩展程序
当然 这只是我们示范文件 提供文件供应功能集的一小部分 我们已经涵盖了API的完整功能集 并将在本次会议发布源代码 我们来聊聊如何实现 刚刚讨论的流程 首先 我们要告诉系统 我们准备好要同步了 这会使一个条目 显示在Finder的侧边栏 我们称这些条目为域 它们会呼应云端服务器上的 登入对谈 每个域都有唯一的辨识符 为了显示它 你可以创建一个新例 然后通过管理对象加入 你还可以删除域 这通常会在用户注销时操作 但在开发初期 和测试期很有用 随着域显示在Finder中 一旦你导航到条目 系统将立即请求项目枚举 接下来是如何实现它 我们的第一步是执行一个项目类 这例子代表 要枚举单个条目 再来我们执行一个枚举器 当系统发出请求 会用我们的项目调用 此时 我们可以通过导航 到侧边栏条目来查看目录 当然 这些目录中的所有文件 都将是无数据的 我们通过 建置内容提取来改变它 在我们打开其中一个的无数据文件时 fetchContents的方法被系统调用 我们的工作是将文件内容 下载到磁盘上的位置 然后用该位置的URL 调用completionHandler 系统会用内容去填补无数据文件 然后帮我们清空 为了让我们的目录架构保持同步 我们将执行另一种枚举器 同步远程更改 系统首先调用currentSyncAnchor方法 来获取同步锚点 你返回一个数据对象 它描述了数据库的更改光标 每当你发出信号 表示某些内容发生改变 系统就会要求自最后一次 所提供的锚点以来所发生的变化 然后你可以返回更改 最后返回一个新的锚点 最后一步是要允许同步更改 如果系统侦测到本地文件的改变 就会调用三种方法的其中一个来创建 修改或是删除现有项目 我们来快速浏览一下创建方法 系统把创建的新项目交给你 就算遵循与你项目相同的协议 它依旧还是系统项目 系统也会提供一组 对该项目有兴趣的字段 例如 项目可能有或没有 附加的扩展属性 而且有字段可以描述 如果设置了内容字段 系统就会向你传递 包含内容的文件URL 描述文件夹或是符号连接的项目 将不会有内容 你要做的是将新的本地项目数据 上传到服务器 然后用生成的远程项目 调用completionHandler
这样就完成了 这时 你的macOS上 会有一个功能文件供应 可以按需求提供文件 将本地更改传播到云端 并将远程更改传到Mac 文件供应框架中 有很多额外选择的API 可以和系统进行更精细的集成 我们来看一下
图标装饰可以在Finder中 进行视觉装饰 你可以标记一个文件图标 浮雕文件或是指示共享状态 为了装饰提供自定义图稿 只要通过应用装置中的UTType 就能做到
上下文菜单操作能让用户 在文件上执行自定义操作 有UI和非UI变体 你可以在你的扩展程序Info.plist 用NSPredicates定义 其适用于哪些文件
飞行前警报让你在用户 可能产生的意外操作之前 警告它们 警报UI和启发警报的标准 也被配置在Info.plist
那么下一步是什么? 首先 你可以下载 所有对谈的示范代码 这是非常好理解的 而且会给你许多指点 为新扩展程序添加一个新目标 到既有的应用程序 而且会有个Xcode模板 可以帮助你开始 由此开始 你只需要照着我们谈论的顺序 执行方法存根 就能立即启动运作了 谢谢您收看这次的对谈 期待看见你的FileProvider扩展程序 在macOS上出现
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。