Как предоставить доступ к файловой системе вне контейнера? - PullRequest
1 голос
/ 19 февраля 2020

Согласно документации 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.

1 Ответ

0 голосов
/ 19 февраля 2020

Даю / com.apple.security.temporary-exception.files.absolute-path.read-write - вот что я делаю для этого.

<key>com.apple.security.temporary-exception.files.absolute-path.read-write</key>
    <array>
        <string>/</string>
    </array>

Да, это абсолютный путь, но он довольно простой и универсальный.

...