Gre*_*ner 1 avplayer security-scoped-bookmarks swift
编辑:在底部添加的其他信息
我有一个基于文档的沙盒应用程序,该程序将用户选择的QuickTime影片加载到AVPlayer中,并且一切运行正常。
现在,我正在升级代码,以便它将使用Security Scoped书签来获取URL,而不仅仅是存储URL字符串,以便持久存储将允许在重新启动应用程序时加载影片。创建书签后,它将存储在托管对象的Data变量中。
由于某些原因,这破坏了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!")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
将书签解析为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()
}
Run Code Online (Sandbox Code Playgroud)
我是“安全范围内的书签”的新手,所以我希望这对以前使用过它们的人来说都是显而易见的。
我想知道这是否是一个问题:
let isSecuredURL = myURL.startAccessingSecurityScopedResource()
Run Code Online (Sandbox Code Playgroud)
也许我打错了电话吗?有时,我发现Apple的文档含糊不清,令人困惑...任何见解将不胜感激!
编辑:
我相信我知道为什么会这样,但是我不确定如何解决...
myURL.startAccessingSecurityScopedResource()
Run Code Online (Sandbox Code Playgroud)
总是返回FALSE ...根据文档,这意味着它不起作用。此外,当电影文件位于我的桌面上时,解析的URL出现如下(我不知道这可能是正常的):
文件:///Users/me/Library/Containers/myapp/Data/Desktop/sample_on_desktop.mov
苹果文档引用了以下事实:文档范围不能使用系统中的文件(又名“ / Library”),但是我的权限设置为使用应用程序范围的书签,并且我的书签是使用nil标志为relativeURL创建的:因此这不应该成为问题。
我只是偶然地偶然发现了答案...
首先,当我解析URL时,我没有使用允许您包含OPTIONS的方法,因此在没有安全范围的情况下解析了我的URL。我要解析的原始代码是:
try myURL = URL.init(resolvingBookmarkData: loadedMovieDatabase[0].bookmark, bookmarkDataIsStable: &urlResult)!
Run Code Online (Sandbox Code Playgroud)
当我应该在这里使用带有选项的版本时:
try myURL = URL.init(resolvingBookmarkData: loadedMovieDatabase[0].bookmark, Options: URL.bookmarkResolutionOptions.withSecurityScope, relativeTo: nil, bookmarkDataIsStable: &urlResult)!
Run Code Online (Sandbox Code Playgroud)
基本上,当我应该进一步查看列表时,我使用了预测性列表中显示的第一个init选项Xcode,其单词为“ resolvingBookmarkData:”。(这是我发现错误的方式。)
还要注意使用它很重要...
URL.bookmarkResolutionOptions.withSecurityScope
Run Code Online (Sandbox Code Playgroud)
并不是
URL.bookmarkCreationOptions.withSecurityScope
Run Code Online (Sandbox Code Playgroud)
...当您解析URL或它似乎无法正常工作时。
这样就结束了我对这个问题的无奈:)我希望这种解释可以帮助其他面对这个问题的人!
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |