macOS 음악 앱에서 작업 중이며 사용자에게 라이브러리 디렉토리를 선택하라는 메시지가 표시됩니다. 선택 후 디렉토리가 스캔되고 Core Data에 음악 개체가 생성됩니다. 콘텐츠의 디렉토리 및 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)"
어떤 도움을 주시면 감사하겠습니다.
securityScopeAllowOnlyReadAccess
선적 서류 비치:
withSecurityScope
옵션 과 함께 사용하면 ...
그것은 withSecurityScope
당신이 놓친 것입니다.
let bookmark: Data = try directory.bookmarkData(options: [.withSecurityScope, .securityScopeAllowOnlyReadAccess], includingResourceValuesForKeys: nil, relativeTo: nil)
init(resolvingBookmarkData:options:relativeTo:bookmarkDataIsStale:)
선적 서류 비치:
App Sandbox를 지원하기 위해 보안 범위 책갈피를 해결하려면
withSecurityScope
옵션을 포함하십시오 .
북마크를 해결할 때 두 번째로 놓치는 부분입니다.
let directory = try? URL(resolvingBookmarkData: bookmarkData, options: [.withSecurityScope], relativeTo: nil, bookmarkDataIsStale: &isStale)
이렇게하면 문제가 해결되지만 isStale
. 인 경우 북마크 데이터를 업데이트해야합니다 true
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다