Согласно документации Apple , чтобы приложение получало доступ к файловой системе вне своего контейнера и вне каталогов, перечисленных здесь , оно должно указывать временные исключения доступа к файлу Право.
Мое приложение должно читать и записывать некоторые файлы в ~/Library/Application Support/
, поэтому я установил значение com.apple.security.temporary-exception.files.home-relative-path.read-write
на /Library/Application Support/
в .entitlement
plist приложения.
Теперь мой Приложение может читать файлы из ~/Library/Application Support/
, если путь жестко закодирован следующим образом:
let filePath = URL(fileURLWithPath: "/Users/myUsername/Library/Application Support/path/to/somefile.txt")
let fileContent = try! String(contentsOf: filePath, encoding: .ascii)
Однако, если я сделаю это следующим образом, он не будет работать:
let filePathString = "~/Library/Application Support/path/to/somefile.txt"
let expandedFilePathString = NSString(string: filePathString).expandingTildeInPath
let filePath = URL(fileURLWithPath: expandedFilePathString)
let fileContent = try! String(contentsOf: filePath, encoding: .ascii) // Error
// alternatively
let applicationSupportPath = try! FileManager.default.url(
for: .applicationSupportDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false
)
let filePath = applicationSupportPath.appendingPathComponent("path/to/somefile.txt")
let fileContent = try! String(contentsOf: filePath, encoding: .ascii) // Error
Обе ошибки связаны с тем, что приложение пытается получить доступ к пути в контейнере: Error Domain=NSCocoaErrorDomain Code=260 "The file “somefile.txt” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/myUsername/Library/Containers/my.bundle.id/Data/Library/Application Support/path/to/somefile.txt, NSUnderlyingError=0x600000c71c20 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
.
Кроме того, FileManager.default.homeDirectoryForCurrentUser
возвращает /Users/myUsername/Library/Containers/my.bundle.id/Data/
.
Мой вопрос: как сделать Я предоставляю моему приложению доступ к файловой системе вне его контейнера, без жесткого кодирования пути?
Мой предыдущий вопрос с той же топикой c был помечен как дубликат этот вопрос . Однако «дублированный» вопрос касается жестко закодированных путей, тогда как мой вопрос касается не жестко закодированных путей. Кроме того, «дублированный» вопрос в Objective- C, тогда как мой вопрос в Swift.