編集:下部に追加された追加情報
ユーザーが選択した QuickTime ムービーを AVPlayer にロードするサンドボックス化されたドキュメント ベースのアプリケーションがあり、すべてが完全に機能していました。
現在、コードをアップグレードして、URL 文字列を保存するだけでなく、Security Scoped ブックマークを使用して 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 が次のように表示されます (これは正常な場合もありますが、わかりません)。
file:///Users/me/Library/Containers/myapp/Data/Desktop/sample_on_desktop.mov
Apple ドキュメントは、Document Scope がシステム内のファイル (別名 "/Library") を使用できないという事実を参照していますが、私の資格はアプリケーション スコープのブックマークを使用するように設定されており、私のブックマークは relativeURL の nil フラグを使用して作成されました: これは問題にならないはずです。