为什么 URL 在存储时被截断,然后从本地文件系统检索?



我使用以下函数生成了一个URL。我想将其保存到本地文件夹以供以后使用。但是,当我将其保存到本地文件夹,然后检索它时,URL 被截断。请有人建议我如何保存和提取完整的 URL?

func createPhotoURL() -> URL {

let fileName = "tempImage_wb.jpg"

let documentsDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = documentsDirectories.first!
let pdfPageURL = documentDirectory.appendingPathComponent("(fileName)")

return pdfPageURL
}

当我调用该函数时,我得到完整的 URL:

let imageURL = createPhotoURL() // CORRECT URL FOR FILE UPLAOD
print("imageURL: (imageURL)")

安慰:

file:///var/mobile/Containers/Data/Application/CDDE2FED-5AAB-4960-9ACF-33E7B42D05AE/Documents/tempImage_wb.jpg

将上述URL保存到本地文件夹并检索:

UserDefaults.standard.set(imageURL, forKey: "URL_IMAGE")
guard let retrievedURL = UserDefaults.standard.string(forKey: "URL_IMAGE") else{return}
print("retrievedURL: (retrievedURL)")

安慰:

retrievedURL: ~/Documents/tempImage_wb.jpg

要回答您的问题,请使用 UserDefaults.standard。url而不是 UserDefaults.standard.string

guard let retrievedURL = UserDefaults.standard.url(forKey: "URL_IMAGE") else{return}

但是,仅当您保存路径并在同一会话中检索它时,这才有效。如果您使用上面的代码并多次运行该应用程序,您将获得非截断的 URL(如您所愿(。但是,如果您正确检查它,您可以看到您实际上在不同的会话中获得了不同的URL。

因此,您不应该将其另存为 URL,而应将其另存为字符串。为此,您可以使用URL的绝对字符串属性

let imageURL = createPhotoURL()
print("imageURL: (imageURL)")
UserDefaults.standard.set(imageURL.absoluteString, forKey: "URL_IMAGE")

要检索,您将首先从UserDefaults中检索保存的字符串,然后将其转换为URL

if let urlString = UserDefaults.standard.string(forKey: "URL_IMAGE"),
let retrievedURL = URL(string: urlString) {
print("retrievedURL: (retrievedURL)")
}

最新更新