gpt4 book ai didi

swift - 安全范围书签 - 书签已解析但仍无法访问文件

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:33 25 4
gpt4 key购买 nike

编辑:在底部添加了附加信息

我有一个基于文档的沙盒应用程序,可以将用户选择的 quicktime 电影加载到 AVPlayer 中,并且一切正常。

现在我正在升级代码,这样它将使用安全范围的书签来获取 URL,而不是仅仅存储 URL 字符串,这样持久存储将允许在重新启动应用程序时加载电影。创建书签后,它存储在托管对象的数据变量中。

出于某种原因,这破坏了 AVPlayer。虽然我已经从用户选择的 URL 创建了一个书签,并且可以在应用程序重新启动时从书签解析 URL,但电影没有正确加载到 AVPlayer 中,我不知道为什么......我已经确认从书签解析的 URL 确实指向电影文件。

我还为项目添加了适当的权利。

这是我的代码:

用户选择要加载的电影并创建书签的函数

 @IBAction func loadMovie(_ sender: Any) {

let openPanel = NSOpenPanel()
openPanel.title = "Select Video File To Import"
openPanel.allowedFileTypes = ["mov", "avi", "mp4"]

openPanel.begin { (result: NSApplication.ModalResponse) -> Void in
if result == NSApplication.ModalResponse.OK {

self.movieURL = openPanel.url
self.player = AVPlayer.init(url: self.movieURL!)

self.setupMovie()

if self.loadedMovieDatabase.count > 0 {
print("Movie Object Exists. Adding URL String")
self.loadedMovieDatabase[0].urlString = String(describing: self.movieURL!)
} else {
print("No Movie Object Exists Yet. Creating one and adding URL String")
let document = NSDocumentController.shared.currentDocument as! NSPersistentDocument
let myManagedObjectContext = document.managedObjectContext!
let newMovie = NSEntityDescription.insertNewObject(forEntityName: "Movie", into: myManagedObjectContext) as! MovieMO
self.loadedMovieDatabase.append(newMovie)
self.loadedMovieDatabase[0].urlString = String(describing: self.movieURL!)
}

// create Security-Scoped bookmark - Added 2/1/18
do {
try self.loadedMovieDatabase[0].bookmark = (self.movieURL?.bookmarkData(options: NSURL.BookmarkCreationOptions.withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil))!
} catch {
print("Can't create security bookmark!")
}

}
}

}

将书签解析为 URL 并加载电影的函数

       // initialize AVPlayer with URL stored in coreData movie object if it exists and is a valid path
if loadedMovieDatabase.count > 0 {
// initialize with saved movie path if it is valid (from security bookmark data)
// let myURL = URL(string: loadedMovieDatabase[0].urlString!) <- replaced with new code below
print("Loading URL from Bookmark")
var urlResult = false
var myURL : URL
do {
try myURL = URL.init(resolvingBookmarkData: loadedMovieDatabase[0].bookmark, bookmarkDataIsStale: &urlResult)!
print("URL Loaded from Bookmark")
print("URL is", myURL)
let isSecuredURL = myURL.startAccessingSecurityScopedResource()
print("IsSecured = ", isSecuredURL)
player = AVPlayer.init(url: myURL)
print("Setting Up Movie")
setupMovie()
} catch {
// No Data in bookmark so load default ColorBars movie instead
print("No Security Bookmark Available. Reverting to Default Color Bars")
let myURL = URL(string: initialMoviePath)
player = AVPlayer.init(url: myURL!)
setupMovie()
}
} else {
// load default ColorBars movie instead
print("Nothing was loaded so just set up a new document.")
let myURL = URL(string: initialMoviePath)
player = AVPlayer.init(url: myURL!)
setupMovie()
}

我是 Security-Scoped Bookmarks 的新手,所以我希望这对以前使用过它们的任何人来说都是显而易见的。

我想知道这是否是以下方面的问题:

let isSecuredURL = myURL.startAccessingSecurityScopedResource()

也许我调用不正确?有时我发现 Apple 的文档含糊不清……任何见解都将不胜感激!

编辑:

我相信我知道为什么会这样,但我不确定如何解决...

myURL.startAccessingSecurityScopedResource()

总是返回 FALSE... 根据文档,这意味着它不工作。此外,虽然电影文件位于我的桌面上,但已解析的 URL 如下所示(这可能是正常的,我不知道。):

文件:///Users/me/Library/Containers/myapp/Data/Desktop/sample_on_desktop.mov

Apple 文档提到文档范围不能使用系统中的文件(又名“/Library”)这一事实,但我的权利设置为使用应用程序范围的书签,而我的书签是使用 nil 创建的relativeURL 的标志:所以这应该不是问题。

最佳答案

我只是偶然发现了答案......

对于初学者来说,当我解析 URL 时,我没有使用允许您包含 OPTIONS 的方法,所以我的 URL 是在没有安全范围的情况下解析的。我要解决的原始代码是:

try myURL = URL.init(resolvingBookmarkData: loadedMovieDatabase[0].bookmark, bookmarkDataIsStable: &urlResult)!

当我应该在这里使用带选项的版本时:

try myURL = URL.init(resolvingBookmarkData: loadedMovieDatabase[0].bookmark, Options: URL.bookmarkResolutionOptions.withSecurityScope, relativeTo: nil, bookmarkDataIsStable: &urlResult)!

基本上,当我本应进一步查看列表时,我使用了预测列表中显示的第一个初始化选项 Xcode,其中包含单词“resolvingBookmarkData:”。 (这就是我发现错误的方式。)

另请注意,使用...很重要

URL.bookmarkResolutionOptions.withSecurityScope

不是

URL.bookmarkCreationOptions.withSecurityScope

...当您解析您的 URL 或它似乎无法正常工作时。

这样就结束了我对这个问题的沮丧 :) 我希望这个解释可以帮助其他面临这个问题的人!

关于swift - 安全范围书签 - 书签已解析但仍无法访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48586796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com