如何在将pdf文档保存到iOS文件应用程序时指定文件名?

如何在将pdf文档保存到iOS文件应用程序时指定文件名?,ios,uiactivityviewcontroller,ios-pdfkit,files-app,Ios,Uiactivityviewcontroller,Ios Pdfkit,Files App,我使用PDFKit在我的应用程序中创建了一个pdf文档。我可以在预览中成功地显示它,并在预览控制器中使用以下代码向用户演示共享操作: @objc func shareAction(_ sender: UIBarButtonItem) { if let data = documentData { let vc = UIActivityViewController(activityItems: [data], applicationActivities: [])

我使用PDFKit在我的应用程序中创建了一个pdf文档。我可以在预览中成功地显示它,并在预览控制器中使用以下代码向用户演示共享操作:

@objc func shareAction(_ sender: UIBarButtonItem)
{
    if let data = documentData
    {
        let vc = UIActivityViewController(activityItems: [data], applicationActivities: [])
        present(vc, animated: true, completion: nil     
    }
}
documentData
包含创建的pdf文档

当用户选择“保存到文件”时,文档将获得默认名称“PDF document.PDF”,用户可以更改该名称


如何提供不同的默认文件名?

这不是一个真正的答案,而是我找到的一个解决方法:

我不需要使用PDF的内存副本
数据
,而是可以将其写入apps tmp文件夹:

var fileURL : URL?
do
{
    let filename = "myfilename.pdf"
    let tmpDirectory = FileManager.default.temporaryDirectory
    fileURL = tmpDirectory.appendingPathComponent(filename)
    try data.write(to: fileURL!)
}
catch
{
    print ("Cannot write PDF: \(error)")
}
然后,共享操作将如下所示:

@objc func shareAction(_ sender: UIBarButtonItem)
{
    if let url = fileURL
    {
        let vc = UIActivityViewController(activityItems: [url], applicationActivities: [])
        present(vc, animated: true, completion: nil     
    }
}

现在,当用户选择“保存到文件”操作时,“myfilename.pdf”显示为默认文件名。

只是一个附加帮助

你最好在适当的时候删除tmp目录中的PDF文件

当viewController解除时,我调用这个func

供参考


是的,谢谢你指出这一点。我正在删除viewcontrollers deinit中的临时文件,但没有提到它。
func deleteAllPDFs() {
    let predicate = NSPredicate(format: "self ENDSWITH '.pdf'")
    let defaultFileManager = FileManager.default

    do {
        let tmpDirURL = defaultFileManager.temporaryDirectory
        let contents = try defaultFileManager.contentsOfDirectory(atPath: tmpDirURL.path)
        let pdfs = contents.filter { predicate.evaluate(with: $0) }
        try pdfs.forEach { file in
            let fileUrl = tmpDirURL.appendingPathComponent(file)
            try defaultFileManager.removeItem(at: fileUrl)
        }
    }
    catch {
        print ("Failed to delete PDF with error: \(error)")
    }
}