AppleTV - tvos - 使用本机和 TVMLKIT 的混合应用程序 - 无法返回本机应用程序

Posted

技术标签:

【中文标题】AppleTV - tvos - 使用本机和 TVMLKIT 的混合应用程序 - 无法返回本机应用程序【英文标题】:AppleTV - tvos - Hybrid app using native and TVMLKIT - Can't back to native app 【发布时间】:2016-04-25 14:23:33 【问题描述】:

我是 TVOS 的初学者。

我想使用原生应用和 TVMLKIT 在 AppleTV 上创建一个混合应用。 我的原生应用程序只是一个带有按钮的简单原生应用程序(使用 swift)。

当我们点击一​​个按钮时,我会启动一个使用 TVLMKIT 和 TVJS 的 javascript 应用程序。

我的 TVJS 使用 Player 来显示视频。 视频结束后,我想关闭 TVJS 应用并返回到原生 ViewController。

我的问题是,当我回到原生应用时,我失去了对原生 View 的关注(应用被冻结)。

原生视图控制器:

import UIKit
import TVMLKit

class ViewController: UIViewController, TVApplicationControllerDelegate 

var window: UIWindow?
var appController: TVApplicationController?
var appControllerContext = TVApplicationControllerContext();
static let TVBaseURL = "http://localhost:9001/"
static let TVBootURL = "\(ViewController.TVBaseURL)/client/js/application.js"

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


@IBOutlet weak var label: UILabel!

@IBOutlet weak var viewAd: UIView!

@IBAction func clickOnlaunchAd(sender: AnyObject) 
    window = UIWindow(frame: UIScreen.mainScreen().bounds)

    guard let javaScriptURL = NSURL(string: ViewController.TVBootURL) else 
        fatalError("unable to create NSURL")
    
    appControllerContext.javaScriptApplicationURL = javaScriptURL
    appControllerContext.launchOptions["BASEURL"] = ViewController.TVBaseURL

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


@IBAction func clickOnChangeText(sender: AnyObject) 
    label.text = "changed";


func appController(appController: TVApplicationController, didStopWithOptions options: [String : AnyObject]?) 
   self.setNeedsFocusUpdate()
   self.updateFocusIfNeeded()


func appController(appController: TVApplicationController, evaluateAppJavaScriptInContext jsContext: JSContext)
    let notifyEventToNative : @convention(block) (NSString!) -> Void = 
        (string : NSString!) -> Void in
            print("[log]: \(string)\n")
            self.appController?.stop()
    
    jsContext.setObject(unsafeBitCast(notifyEventToNative, AnyObject.self), forKeyedSubscript: "notifyEventToNative")


就在从我的 TVJS 调用“notifyEventToNative”之前,我调用了“navigationDocument.clear();”清除 TVML 视图。

我可以看到我的原生应用,但无法与之交互。

有什么想法吗? 谢谢。

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题。我从 UIViewController 打开了一个 TVML 文档。我也失去了焦点。因此,首先我可以建议您在 ViewController 中覆盖名为 preferredFocusedView 的 var。在此方法中,您可以返回对 viewAd 的引用。但更好的解决方案是将您的 ViewController 包装到 TVML-item 中(使用 TVMLKit 框架)。在这种情况下,我希望您不会有焦点问题,因为您将在整个应用程序中使用 TVML。

【讨论】:

以上是关于AppleTV - tvos - 使用本机和 TVMLKIT 的混合应用程序 - 无法返回本机应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apple TV (TvOS) 中全屏播放视频

如何处理 tvOS 和 Android TV 之间的 React Native 应用程序中的缩放问题?

如何在 Xcode 9 中使用 iOS 11、Apple TV 4K 等进行无线调试?

无法通过 Apple Configurator 2 在 Apple TV 上安装 Charles Proxy 配置文件

如何找出(使用 XCTest UITest)在 tvOS AppleTV 的表格视图中具有焦点的单元格?

如何在应用商店中直播 tvOS 应用