read
URL is a very common data structure, and can be used for http, file, and other schema.
But I often fell into the pitfalls of using it.
The biggest of all is using the wrong initializer.
Initializations URL(fileURLWithPath:) vs URL(string:)
For local files, always use URL(fileURLWithPath:).
The initialization does 2 things:
- Encode if needed
- Append
file://if needed
So for the string path /Document/Space .txt, the initialization will create the URL file:///Document/Space%20.txt.
Use FileManager
Use this for forming URL for local files:
let documentDirectory = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileURL = documentDirectory.appendingPathComponent("secret.txt")
Pitfall: UIActivityViewController
The activityItems can accept a URL to a local file, but they need to be in the format of file://....
If it is not, it will not be sharable 🤔
So do this, if needed:
let fileUrl = URL(fileURLWithPath: url.absoluteString)
Or just don’t ever use URL(string:) for local files.