Swift 使用元数据将应用程序对象链接到磁盘上的文件

Swift 使用元数据将应用程序对象链接到磁盘上的文件,swift,pdfkit,file-manager,Swift,Pdfkit,File Manager,以下是本主题: 我的应用程序正在使用PDFKit保存文件 我正在尝试将自定义密钥元数据设置为保存在设备上的PDFDocument。 我的应用程序中的对象(“测试”)有两个重要属性: id:能够检索磁盘上文件的UUID(链接的磁盘上文件URL是此_UUID.jpg) 名称:用户设置的可读字符串 这会导致一些问题: 文件名是一个UUID,不能被人读取,因此用户体验不好 如果用户重命名该文件,应用程序将无法获取该文件 因此,id为文件提供了一个人类可读的标签。因此,当用户打开文件应用程序时,他可以

以下是本主题:

我的应用程序正在使用PDFKit保存文件 我正在尝试将自定义密钥元数据设置为保存在设备上的PDFDocument。 我的应用程序中的对象(“测试”)有两个重要属性:

  • id:能够检索磁盘上文件的UUID(链接的磁盘上文件URL是此_UUID.jpg)
  • 名称:用户设置的可读字符串
这会导致一些问题:

  • 文件名是一个UUID,不能被人读取,因此用户体验不好
  • 如果用户重命名该文件,应用程序将无法获取该文件
  • 因此,id为文件提供了一个人类可读的标签。因此,当用户打开文件应用程序时,他可以很容易地找到它。并添加id为的元数据,这样即使重命名,我的应用程序也可以检索它。看起来是个不错的解决方案,对吗

    //首先我创建自己的属性
    fileprivate扩展PDFDocumentAttribute{
    静态let testId=PDFDocumentAttribute(rawValue:“com.sc.testId”)
    }
    //然后在保存文件之前,在“test”类中设置新闻属性
    func setDocument(pdf:pdf文档){
    让fileURL=self.getPDFDocumentURL()
    打印(“元数据是\(pdf.documentAttribute)”//打印一个空字典
    pdf.documentAttribute?[PDFDocumentAttribute.testId]=self.id
    pdf.documentAttributes?[PDFDocumentAttribute.titleAttribute]=self.name//我想是文档的ddisplay名称?不是,那是什么?
    打印(“元数据现在是\(pdf.documentAttributes)”//两者都已打印,看起来还可以
    //write(to:fileURL)//我也测试了这个,同样的问题
    让data=pdf.dataRepresentation()
    做{
    尝试数据?写入(到:fileURL,选项:.completeFileProtection)
    }抓住{
    打印(错误。本地化描述)
    }
    }
    
    从这里看起来不错,当我想要检索pdf文档时,我会在文件夹中检查每个文档的id,并在id匹配时返回文档。但问题是,当我获取文档属性时,“testId”属性不在其中。请注意,本机标题设置正确。 所以我可以从那里得到身份证,但那看起来很不合适

    //仍在“测试”类中
    func getPDFDocument()->PDFDocument?{
    //获取文件夹中的所有文档并检查每个文档的元数据
    让fileManager=fileManager.default
    让documentsURL=fileManager.URL(对于:.documentDirectory,在:.userDomainMask中)[0]
    做{
    让fileurl=try fileManager.contentsOfDirectory(位于:SchoolTest.getSubjectFolderURL(主题:self.subject!),包括属性forkeys:nil)
    用于文件url中的url{
    打印(“文档属性为:\(PDFDocument(url:url)?.documentAttribute)”//包含苹果预设的标题和其他内容,但不包含我的自定义“testId”
    如果让doc=PDFDocument(url:url),doc.documentAttribute?[PDFDocumentAttribute.titleAttribute/*testId*/]as?String==self.documentName{
    退货单//此项工作为临时工作
    }
    }
    }抓住{
    打印(“枚举文件时出错\(documentsURL.path):\(Error.localizedDescription)”)
    }
    归零
    }
    
    显示名称: 当前,文件应用程序中显示的显示名称/标签是文件名(来自URL)。 这也会导致问题,因为如果两个“测试”具有相同的名称,那么它们的链接文件将具有相同的URL。因此,当最近的一个将被保存在磁盘上时,它将覆盖另一个。 这是我在为文件URL使用“Test”id属性时没有遇到的问题。 如果我可以为文件设置一个显示名,并使用UUID保留URL,那么应该可以解决这个问题。 目录也有同样的本地化问题,我用英语给它们命名,但苹果本地目录是本地化的。本地化名称对于用户体验来说可能很好。 经过数小时的研究,我找不到一种方法来对我的文件/目录进行本地化或应用显示名称

    //我试过了,但没有结果
    var url=文件url作为NSURL
    尝试url.setResourceValue(“本地化标签”,forKey:.localizedLabelKey)
    打印(“本地化名称为\(尝试url.resourceValues(forKeys:[.localizedLabelKey]))”)
    让newURL=url作为url
    尝试数据?写入(到:newURL,选项:.completeFileProtection)
    
    我做得不好吗?在向文件中添加自定义metada时,我们应该怎么做