什么是Finder Sync
在 OS X 中,Finder 同步扩展点可让您干净安全地修改 Finder 的用户界面,以表达文件同步状态和控制。与大多数扩展点不同,Finder Sync 不会向主机应用程序添加功能。相反,它允许您修改 Finder 本身的行为。
使用 Finder Sync 扩展,您可以注册一个或多个文件夹以供系统监控。然后,您的 Finder Sync 扩展程序会为受监控文件夹中的任何项目设置徽章、标签和上下文菜单。您还可以使用扩展点的 API 将工具栏按钮添加到 Finder 窗口或监控文件夹的侧边栏图标。
Finder Sync 支持将本地文件夹的内容与远程数据源同步的应用程序。它通过直接在 Finder 中提供即时视觉反馈来改善用户体验。徽章显示每个项目的同步状态,上下文菜单让用户管理文件夹内容。自定义工具栏按钮可以调用全局操作,例如打开受监控的文件夹或强制同步操作。
Finder Sync 扩展点允许您在 Finder 中修改项目的外观。它不支持同步文件。您负责创建自己的同步组件。
Finder 同步扩展可以:
- 注册一组要监控的文件夹。
- 当用户开始或停止浏览受监控文件夹的内容时接收通知。
- 例如,当用户在 Finder 或打开或保存对话框中打开受监控的文件夹时,扩展程序会收到通知。
- 添加、删除和更新受监控文件夹中项目的徽章和标签。
- 当用户按住 Control 键单击受监控文件夹内的项目时显示上下文菜单。
- 将自定义按钮添加到 Finder 的工具栏。
- 与徽章和上下文菜单项不同,此按钮始终可用,即使用户当前未浏览受监控的文件夹。
在 Xcode 中创建 Finder 同步扩展
要创建 Finder Sync 扩展,请使用 Finder Sync 扩展模板将新目标添加到您的 OS X 项目。此模板包含FIFinderSync该类的自定义子类。这个子类作为你的扩展的主类。系统自动实例化此类并调用协议方法以响应用户操作。
有关添加扩展的详细信息,请参阅创建应用扩展。
设置所需的属性列表值
为了让 OS X 识别并自动加载 Finder Sync 扩展,扩展目标的info.plist文件必须包含以下条目:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict/>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.FinderSync</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).FinderSync</string>
</dict>
特别是,NSExtensionPrincipalClass键必须提供FIFinderSync子类的名称。当 Finder 首次启动时,系统会自动实例化此类。每当显示打开或保存对话框时,它都会实例化一个额外的副本。每个副本都在自己的进程中运行。
Finder Sync Extension Xcode 模板会Info.plist自动配置这些键。如果要更改主体类,请修改NSExtensionPrincipalClass键的值。
指定要监控的文件夹
您可以init使用默认FIFinderSyncController对象在 Finder Sync 扩展的方法中指定要监视的文件夹。在大多数情况下,您希望让用户在包含应用程序提供的 UI 中指定这些文件夹。您可以使用共享的用户默认值在包含的应用程序和您的 Finder 同步扩展程序之间传递此数据。
要启用共享用户默认设置,首先将您的 Finder Sync 扩展程序及其包含的应用程序添加到应用程序组。该组创建了一个两个进程都可以访问的共享容器。对于每个目标,打开 Xcode 功能窗格并打开 App Groups 功能。为共享组提供唯一标识符。确保对 Finder Sync 扩展和包含的应用程序使用相同的标识符。
此过程com.apple.security.application-groups向目标的权利添加一个条目。
<key>com.apple.security.application-groups</key>
<array>
<string>com.example.domain.MyFirstFinderSyncApp</string>
</array>
有关应用程序组的更多信息,请参阅将应用程序添加到应用程序组。
接下来,NSUserDefaults通过调用initWithSuiteName:并传入共享组的标识符来实例化一个新对象。此init方法创建一个用户默认对象,用于将数据加载并保存到共享容器。
// Set up the folder we are syncing.
NSUserDefaults *sharedDefaults =
[[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyFirstFinderSyncExtension"];
self.myFolderURL = [sharedDefaults URLForKey:MyFolderKey];
if (self.myFolderURL == nil) {
self.myFolderURL = [NSURL fileURLWithPath:[@"~/Documents/MyFirstFinderSyncExtension Documents" stringByExpandingTildeInPath]];;
}
[FIFinderSyncController defaultController].folderURLs = [NSSet setWithObject:self.myFolderURL];
设置徽章图像
创建您的徽章图像,以便每个徽章都可以以高达 320×320 的像素绘制。对于每张图像,用您的作品边缘到边缘填充整个框架(换句话说,不使用填充)。系统确定受监控物品上徽章图像的大小和位置。您的徽章可能显示的像素大小范围如下:
视网膜屏幕12×12 到 320×320
非视网膜屏幕8×8 到 160×160
要将徽章图像添加到 Finder Sync 控制器的配置,请使用该setBadgeImage:label:forBadgeIdentifier:方法,如下所示:
[[FIFinderSyncController defaultController]
setBadgeImage: uploadedImage
label: NSLocalizedString(@"Uploaded", nil)
forBadgeIdentifier: @"UploadComplete"];
您通常会在同步控制器的初始化方法中执行此操作。您可以根据需要设置任意数量的徽章图像。您在此处指定的徽章标识符字符串允许您稍后检索图像以将其应用于受监控的项目,如典型 Finder 同步用例 中所述。
性能问题
Finder Sync 扩展可能比大多数其他扩展具有更长的使用寿命。由于使用寿命很长,您必须特别小心以避免任何可能的性能问题。理想情况下,Finder Sync 扩展应该大部分时间都在运行但处于空闲状态。限制扩展消耗的资源数量。最重要的是,一定要避免泄漏任何资源。随着时间的推移,即使是很小的涓涓细流也可能发展成严重的问题。
每当显示“打开”或“保存”对话框时,系统还可能会启动扩展的其他副本。这意味着用户可能会同时运行多个扩展副本,有些可能非常短暂。因此,通常最好是扩展程序专注于处理徽章、上下文菜单和工具栏按钮。将执行同步、更新状态或与远程数据源通信的任何代码放在单独的服务(登录项或启动代理)中。这种方法可确保一次只运行一个同步服务。
精品教程推荐
加入我们一起学习SwiftUI
QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com