TOFileSystemObserver v0.0.4

TOFileSystemObserver v0.0.4

Tim Oliver 维护。



  • Tim Oliver

TOFileSystemObserver

TOFileSystemObserver

CI Version Platform GitHub license PayPal Twitch

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帖子,但一个极其聪明的人发现,当文件仍在复制时,其报告的修改日期将与当前日期相同。通过这种方式,我们可以检查文件是否仍在复制。

致谢

TOFileSystemObserverTim Oliver创建,作为iComics的一个组件。

非常感谢Jeffrey Bergier,他的JSBFileSystem是这个库的基础灵感来源,并且他在项目开始阶段让我向他抛出想法(例如,放弃在磁盘上有存储)给予了我帮助。

iOS设备模拟图由Pixeden创作。

许可证

TOFileSystemObserver 在 MIT 许可下可用。请参阅 LICENSE 文件获取更多信息。 analytics