Разрешения Swift Url Bookmark потеряны после перезагрузки компьютера - PullRequest
1 голос
/ 19 июня 2020

Я работаю над приложением macOS musi c, в котором я предлагаю пользователю выбрать каталог библиотеки. После выбора каталог сканируется, и в Core Data создаются объекты musi c. Чтобы сохранить права доступа к каталогу и URL-адреса его содержимого, я сохраняю URL-адрес каталога в виде закладки. Упрощенный код:

let directoryAndPermissionsKey: String = "" // Key for storing url to UserDefaults


/// Saves directory and permissions
func storeDirectoryAndPermissions(for directory: URL) throws -> Void {
    // Saves directory and permissions
    do {
        // Creates bookmark
        let bookmark: Data = try directory.bookmarkData(options: .securityScopeAllowOnlyReadAccess, includingResourceValuesForKeys: nil, relativeTo: nil)

        // Stores directory and permissions
        UserDefaults.standard.removeObject(forKey: directoryAndPermissionsKey)
        UserDefaults.standard.set(bookmark, forKey: directoryAndPermissionsKey)

    // Throws error
    } catch {
        throw PersistentLibraryError.cannotSaveDirectory
    }
}


/// Retrieves directory
func retrieveDirectoryUrl() -> URL? {
    // Indicates if data is stale
    var isStale: Bool = false

    // Makes sure that directory and permissions are stored
    guard
        UserDefaults.standard.object(forKey: directoryAndPermissionsKey) != nil,
        let bookmarkData = UserDefaults.standard.object(forKey: directoryAndPermissionsKey) as? Data,
        let directory = try? URL(resolvingBookmarkData: bookmarkData, bookmarkDataIsStale: &isStale)
    else {
        return nil
    }

    // Starts accessing directory
    _ = directory.startAccessingSecurityScopedResource() 

    // Returns directory
    return directory
}

Кроме того, в файл plist включены следующие строки:

<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>

Код до сих пор работал отлично. Даже когда я закрываю и повторно запускаю приложение, я все равно могу инициализировать AV Audio Player без каких-либо проблем с разрешениями.

Однако недавно я обнаружил, что при перезапуске компьютера выдается следующая ошибка при попытке для инициализации AVAudioPlayer:

Error Domain=NSOSStatusErrorDomain Code=-54 "permErr: permissions error (on file open)"

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 19 июня 2020

Создать закладку

securityScopeAllowOnlyReadAccess документация:

В сочетании с опцией withSecurityScope ...

Он должен сочетаться с withSecurityScope, это то, что вам не хватает.

let bookmark: Data = try directory.bookmarkData(options: [.withSecurityScope, .securityScopeAllowOnlyReadAccess], includingResourceValuesForKeys: nil, relativeTo: nil)

Разрешить закладку

init(resolvingBookmarkData:options:relativeTo:bookmarkDataIsStale:) документация:

Чтобы разрешить закладку с ограниченным уровнем безопасности для поддержки тестовой среды приложения, включите параметр withSecurityScope.

Это вторая вещь, которую вам не хватает при разрешении закладки.

let directory = try? URL(resolvingBookmarkData: bookmarkData, options: [.withSecurityScope], relativeTo: nil, bookmarkDataIsStale: &isStale)

Хотя это должно решить вашу проблему, имейте в виду, что вы не обрабатываете isStale. Вам необходимо обновить данные закладки, если это true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...