Swift: Application Supportフォルダでハマった話

NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
で、例えば/var/mobile/Containers/Data/Application/FCA6162A-BC31-415F-B053-AABBED1BA710/Library/Application Support
などというフォルダパス(の配列)が取れてくるのですが、これでハマりました。
上で取れてくるのはパス文字列なのですが、これをURL(filePath:)
でURLに変換し、それをまた別の箇所でurl.path()
で戻してファイル操作しようとしたら、失敗しまくります。
Application Support
というフォルダ名にはスペースが含まれていて、URLにしたときには%20
に変換されます。url.path()
はそのままだと%20
を%20
のまま返してきます。
このため、
/var/mobile/Containers/Data/Application/FCA6162A-BC31-415F-B053-AABBED1BA710/Library/Application Support
↓URL(filePath:)
file:///var/mobile/Containers/Data/Application/FCA6162A-BC31-415F-B053-AABBED1BA710/Library/Application%20Support
↓url.path()
/var/mobile/Containers/Data/Application/FCA6162A-BC31-415F-B053-AABBED1BA710/Library/Application%20Support
で、もとのパスと違うパスになってしまっていました。
url.path()
ではなくurl.path(percentEncoded: false)
を使う必要があります。
percentEncoded:false
を指定すると%20
が残らなくなります(デコードされます)。
NSSearchPathForDirectoriesInDomains
で.documentDirectory
を指定するとうまくいくのでディレクトリの書き込みパーミッションなのかとか、そもそもApplication Support
フォルダを自前で作らないといけないのかとか、起動するたびに上記パスに含まれるUUIDが変わるのがいけないのか、とか、色々悩みましたが、原因が分かれば単純な話でした。