TOFileSystemObserver
TOFileSystemObserver
是一个用于检测 iOS / iPadOS 应用沙盒内容用户发起更改的坚不可摧机制(希望如此)。
自 iOS 11 以来,Files 应用允许应用将其 Documents 目录的内容暴露给用户,让用户在应用关闭、挂起或与 iPad 多任务并运行时操作文件。
对于显示来自 Documents 库的文件列表的基于文档的应用,这个库旨在让您检测和响应所有必需调整 UI 和缓存的文件事件。
特性
- 一个在应用会话期间运行并处理系统文件事件的类。
- 可以检测到任何子目录级别的文件更改。
- 可以检测到用户导入新文件,并且能够检测到大文件复制完成。
- 可以检测到用户移除文件,包括在不同的目录级别之间。
- 可以检测到用户从 Files 应用或通过 iTunes 直接删除文件。
- 可以检测到用户重命名文件。
- 可以检测到用户通过 Files 应用复制相同的文件。
- 提供表示目录内容的“实时”对象,当文件系统更新时也会更新。
示例
#import "TOFileSystemObserver.h"
// Create a new instance (Targets the Documents directory by default)
TOFileSystemObserver *observer = [[TOFileSystemObserver alloc] init];
// Start observing the target directory.
[observer start];
// Register a notification token to receive events from the observer
TOFileSystemNotificationToken *observerToken = [self.observer addNotificationBlock:
^(TOFileSystemObserver *observer,
TOFileSystemObserverNotificationType type,
TOFileSystemChanges *changes)
{
// At the start of the session, the observer will perform a full system scan.
// This event will give observers a chance to set up before the scan.
if (type == TOFileSystemObserverNotificationTypeWillBeginFullScan) {
NSLog(@"Scan Will Start!");
return;
}
// At the start of the session, the observer will perform a full system scan.
// This event will give observers a chance to clean up after the scan.
if (type == TOFileSystemObserverNotificationTypeDidCompleteFullScan) {
NSLog(@"Scan Complete!");
return;
}
NSLog(@"%@", changes);
}];
有关此库功能的更多示例,请查看示例应用。
需求
TOFileSystemObserver
可与iOS 8.0及更高版本协同工作。虽然它是用Objective-C编写的,但它也会与Swift协同使用(但Swift界面可能需要更多的工作。)
手动安装
将TOFileSystemObserver
文件夹的内容复制到您的应用程序项目中。
CocoaPods
pod 'TOFileSystemObserver'
Carthage和SPM
我目前只打算使用CocoaPods与这个库结合,所以现在Carthage和SPM的优先级较低。如果您希望获得Carthage或SPM支持,请提交PR。
它是如何工作的?
在文件系统中观察文件涉及各种问题,每个问题都需要解决以确保正常工作。
接收文件变化的系统事件
历史上,苹果员工推荐使用DispatchSource
来检测文件更改。然而,由于这不支持子目录,所以它不适合在这里使用。相反,TOFileSystemObserver
使用NSFilePresenter
(协调文件访问组件)来检测文件何时发生变化。
在磁盘上唯一跟踪文件
由于文件名很容易改变,且无法保证其唯一性(例如,不同文件夹中的多个Chapter1.zip
文件),因此有必要为每个文件分配一个用户难以修改且唯一的ID。
为此,TOFileSystemObserver
使用了APFS的扩展文件属性功能,为每个它跟踪的文件附加一个唯一的UUID字符串。然后,观察者保留一个内存图,其中包括每个文件的UUID和它们最后一次位置的网络地址,以便确定文件是否被移动或重命名。
确定文件何时正在复制
NSFilePresenter
会在文件复制过程中触发2次:一次在开始时,再次在结束时。由于大多数文件导入只能在文件复制完成后发生,因此需要一种方式来检查文件是否已完成复制。我很遗憾丢失了原始Stack Overflow帖子,但一个极其聪明的人发现,当文件仍在复制时,其报告的修改日期将与当前日期相同。通过这种方式,我们可以检查文件是否仍在复制。
致谢
TOFileSystemObserver
由Tim Oliver创建,作为iComics的一个组件。
非常感谢Jeffrey Bergier,他的JSBFileSystem
是这个库的基础灵感来源,并且他在项目开始阶段让我向他抛出想法(例如,放弃在磁盘上有存储)给予了我帮助。
iOS设备模拟图由Pixeden创作。
许可证
TOFileSystemObserver
在 MIT 许可下可用。请参阅 LICENSE 文件获取更多信息。