gpt4 book ai didi

swift - 从 Apple TV Top Shelf 播放视频

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:34 26 4
gpt4 key购买 nike

我创建了一个简单的 AppleTV 项目来按类别显示多个视频,浏览和播放视频工作正常。它已作为使用 TVML 和 TVJS 的客户端-服务器应用程序实现,因此大部分应用程序逻辑都在 Javascript 文件中。这些是定期从动态内容在后台静态生成的。

然后我向应用程序添加了一个 TopShelf 扩展程序,它从 API 中提取一些特色视频,这也工作正常,按预期提取视频。

我遇到的问题是检测用户从最上面的架子上选择视频并使用react。我已经创建了一个 URL 方案 exampletvapp://,我已经在我的 plist 文件中注册了它。

我还向 TVContentItems 添加了 displayURL 和 playURL。选择其中一个视频时,我的应用程序按预期启动但实际上并未处理该视频的播放。

在我的 AppDelegate 文件中,我添加了用于打印 launchOptions 的打印语句,还添加了一个 openUrl 函数,该函数确实会被调用,但仅在我关闭应用程序并在应用程序关闭之前快速从顶部架子中选择某些内容时才会记录此功能,并且我失去调试 session 。

// AppDelegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

print("App Launch: \(launchOptions)")
window = UIWindow(frame: UIScreen.mainScreen().bounds)

let appControllerContext = TVApplicationControllerContext()

guard let javaScriptURL = NSURL(string: AppDelegate.TVBootURL) else {
fatalError("unable to create NSURL")
}

appControllerContext.javaScriptApplicationURL = javaScriptURL
appControllerContext.launchOptions["BASEURL"] = AppDelegate.TVBaseURL

if let options = launchOptions {
for (kind, value) in options {
if let kindStr = kind as? String {
appControllerContext.launchOptions[kindStr] = value
}
}
}

appController = TVApplicationController(context: appControllerContext, window: self.window, delegate: self)

return true
}

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {

guard let javaScriptURL = NSURL(string: AppDelegate.TVBootURL) else {
fatalError("unable to create NSURL")
}

let appControllerContext = TVApplicationControllerContext()
appControllerContext.javaScriptApplicationURL = javaScriptURL
appControllerContext.launchOptions["BASEURL"] = AppDelegate.TVBaseURL


for (kind, value) in options {
appControllerContext.launchOptions[kind] = value
}

appController = TVApplicationController(context: appControllerContext, window: self.window, delegate: self)

return true
}

func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {
print("handle Url called")
}

Javascript:

// Application.js
App.onLaunch = function(options) {
var javascriptFiles = [
`${options.BASEURL}js/ResourceLoader.js`,
`${options.BASEURL}js/Presenter.js`
];

console.log("options", options);

我已经在 J​​S 文件中添加了一个 console.log 以检查是否传递了选项,但它没有记录任何内容。我的意图是创建一个 Player 对象,其中包含一个仅包含从 TopShelf 中选择的视频的播放列表。但由于 URL 似乎只传递 ID,这意味着我需要发出 ajax 请求来获取视频信息,即使我已经在 TVContentItem 中获得了它。

所以我的问题是:我是应该将来自 topshelf 的视频本地添加到播放列表中并播放它(使用 Swift)还是将细节传递到 javascript 端以供播放。如果是 javascript,有没有办法查看 console.log 的输出?因为我没有看到任何使它很难使用的东西。

更新:

我对此有更进一步的了解,我发现(通过 Apple 开发者论坛)您可以通过“开发”>“设备”菜单将 Safari 附加到 Apple TV 模拟器中的 JS 上下文。我已经这样做了,到目前为止,URL 没有通过选项传递给 JS。 url 被传递给 openURL 委托(delegate)函数,该函数需要以某种方式传递给 JS,或者我需要本地播放视频。

我目前正在研究通过在 displayURL 中传递所有必需的信息来创建 TVContentItem 以原生方式播放视频。我看不到从 openURL 方法将此对象传递给 JS 的方法,除非我创建 Controller 的新上下文和实例(这甚至可能不起作用)

最佳答案

我终于让这个本地工作了。我也设法通过将 openUrl 传递给 JS 来让它工作,但它对我来说似乎不太可靠。我稍后会进一步研究,我现在只需要它工作。

下面的代码创建一个 AVPlayer 和 AVPlayerViewController 并呈现 ViewController 并在完成时将其关闭。到目前为止,我还没有发现这种方法有任何问题,但我仍在测试中。

// AppDelegate.swift
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {

let urlString = "http:\(url.path!)"
let url = NSURL(string: urlString)!
print("opening URL: \(url)")

let item = AVPlayerItem(URL: url)

// Need to listen to the end of the player so we can dismiss the AVPlayer
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: item)

let player = AVPlayer(playerItem: item)
player.actionAtItemEnd = AVPlayerActionAtItemEnd.None
let playerVC = AVPlayerViewController()
playerVC.player = player

appController?.navigationController.presentViewController(playerVC, animated: true, completion: nil)
player.play()

return true
}

func playerDidFinishPlaying (note: NSNotification) {
// Dimiss the AVPlayer View Controller from the Navigation Controller
appController?.navigationController.dismissViewControllerAnimated(true, completion: nil)
}

关于swift - 从 Apple TV Top Shelf 播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33169391/

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