NSDocument 唯一标识符

Posted

技术标签:

【中文标题】NSDocument 唯一标识符【英文标题】:NSDocument unique identifier 【发布时间】:2017-01-18 03:14:36 【问题描述】:

问:有没有什么方法可以在基于 Document™ 的应用程序中获取唯一的 NSDocument 标识符,它在应用程序重启期间是持久的?

注意 1:肯定应该有某种 id,而不仅仅是 fileURL,而是其他的,因为应用程序适用于自动保存甚至尚未保存的文档。

注意 2:出于某些原因,我不想生成此 id 并将其保存到文档的内容文件中。

【问题讨论】:

您的文档是单个文件还是一个包?它有存储元数据的地方吗? @MichaelDautermann 这是一个纯文本文件。 相关问题:NSFileSystemFileNumber is changed after file is edited/updated in objective c 【参考方案1】:

即使我没有尝试过,我认为扩展属性也可以完成这项工作:

uuid_t uuid;
[[NSUUID new] getUUIDBytes:uuid];

int result = setxattr( path, "com.yourcompany.yourapp.yourattr", &uuid, sizeof(uuid), 0, 0);

由于扩展属性既不是文件本身的一部分,也不是所有文件系统的标准,当文件被复制到不支持此类属性的文件系统的存储上时,它们可能会丢失。

【讨论】:

【参考方案2】:

我最终在一个方法中将数据保存到 coder encodeRestorableStateWithCoder 在文档关闭期间并在重新打开文档时恢复 restoreDocumentWindowWithIdentifier 中的数据。

- (void) encodeRestorableStateWithCoder: (NSCoder *) coder 
    [super encodeRestorableStateWithCoder: coder];
    [coder encodeObject: @@"color":@"red" forKey: @"OBJECT_KEY"];


- (void) restoreDocumentWindowWithIdentifier: (NSString *) identifier
                                       state: (NSCoder *) state
                           completionHandler: (void (^) (NSWindow *, NSError *)) completionHandler 
    NSDictionary * restoredInfo = [state decodeObjectForKey: @"OBJECT_KEY"];
    [super restoreDocumentWindowWithIdentifier: identifier state: state completionHandler: completionHandler];

我认为可以将生成的 UID 保存在那里,但这种存储可能不是很可靠。

【讨论】:

以上是关于NSDocument 唯一标识符的主要内容,如果未能解决你的问题,请参考以下文章

如何获取Android唯一标识

Android 设备唯一标识

如何获取Android唯一标识

js如何生成唯一标识符UUID

2020-09-07 手机设备唯一标识

如何获取Android唯一标识