我有一个iOS应用程序,我需要扩展到tvOS.我找到的所有信息都在解释如何从头开始!有没有办法将我的应用程序扩展到tvOS,或者我应该用它开始一个新项目?
Update1: 我的问题是:如何扩展我现有的项目以支持tvOS而无需从头开始构建它?
Update2: Jess Bower指向Apple的网站:
通过在App Store上为您的应用程序实现通用购买,使客户能够通过一次购买在iOS和新Apple TV上享受他们喜爱的应用程序.
这意味着我们需要在现有项目上创建一个新的捆绑包并启用"通用"购买,因此它将被视为App Store上的一个应用程序.
有没有办法在Apple tvOS TVML
基础应用程序中使用自定义字体?我试过这个@font-face
规则无济于事.
<document>
<head>
<style>
@font-face {
font-family: 'My Awesome Font';
font-weight: 600;
src: url("${this.BASEURL}/resources/fonts/awesome-font-bold.otf");
}
</style>
</head>
...
</document>
Run Code Online (Sandbox Code Playgroud) 我开始了一个空白的tvOS项目并创建了以下代码:
- (void)viewDidLoad
{
[super viewDidLoad];
AVPlayer *avPlayer = [AVPlayer playerWithURL:[NSURL URLWithString:@"http://www.myurl.com/myvideo.mp4"]];
AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
avPlayerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view.layer addSublayer:avPlayerLayer];
[avPlayer play];
}
Run Code Online (Sandbox Code Playgroud)
一旦应用加载,模拟器中没有任何事情发生.没有视频,没有,只是我的Apple TV模拟器中的空白半透明屏幕.
从HTTP源播放Apple TV应用程序的应用程序启动示例视频的正确方法是什么?
在Apple TV宣布期间,Crossy Road的开发人员使用iPhone作为Apple电视游戏的第二控制器:
http://www.macrumors.com/2015/09/09/cooperative-play-for-crossy-road/
我的第一个想法是使用Multipeer Connectivity Framework实现这一点.但是,它不支持tvOS.有没有一种很好的方法可以在没有Multipeer Connectivity的情况下将iPhone连接到Apple TV?
更新:似乎我不能使用GameKit,因为GKPeerPickerController已从tvOS上的GameKit中删除.
我在探索tvOS
,我发现,苹果提供了很好的一套模板使用写入TVML
.我想知道tvOS
使用TVML
模板的应用程序是否也可以使用UIKit
.
我可以在一个应用程序中混合使用UIKit和TVMLKit吗?
我在Apple开发者论坛上发现了一个帖子,但它没有完全回答这个问题,我正在通过文档找到答案.
对于Apple TVOS,使用TVML而不是自定义应用程序(基于媒体的应用程序而非游戏)是否有任何优势?从我从Apple的文档中读到的,我无法弄清楚任何这样的优势(尽管它主要是关于TVML/TVJ).
对于iOS(Swift,Objective C)开发人员来说,使用自定义似乎更容易,更快速且具有更多可能性.
我认为Apple提供的任何模板都可以使用UIKit构建,因为它内部是UIKit.对?
[更新]
让我重新解释我原来的问题,因为到目前为止的答案没有给出任何支持自定义App的观点.我同意@shirefriendship有一些真正的有效点支持TVML(最大的一个是 - >应用程序更改可能没有应用程序更新).使用自定义优于TVML有什么优势吗?喜欢TVML无法触及的任何东西?
所以我有一个标准设置,用于在我的tvOS应用程序中设置搜索视图.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let resultsController = storyboard.instantiateViewControllerWithIdentifier(SearchResultsViewController.storyboardIdentifier) as! SearchResultsViewController
let searchController = UISearchController(searchResultsController: resultsController)
searchController.searchResultsUpdater = resultsController
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchBar.placeholder = NSLocalizedString("Enter keyword (e.g. iceland)", comment: "")
let searchContainer = CustomUISearchContainerViewController(searchController: searchController)
Run Code Online (Sandbox Code Playgroud)
当推入导航堆栈时,这是一个视图,其顶部有搜索栏,下面的结果如下所示
因此,每当结果很大并且我必须滚动键盘时,只要我向上滚动并向上滑过最顶端的结果,键盘就会折叠并再次展开.有什么方法可以防止这种行为吗?我只是希望它一直保持开放状态.我想的可能是子类化UISearchController
,但我不确定在那里甚至可以替换
我很好奇我是否可以编写可以控制Apple TV的程序,特别是运行tvOS 9.1.1的Apple TV第四代,就像Apple的iOS远程应用程序一样.我想发送命令,用于在四个主要方向导航,在屏幕上选择一个项目,向上导航堆栈 - 基本上是Apple的远程应用程序可以执行的操作.
有没有人对它使用的协议进行逆向工程?到目前为止,Cursory谷歌搜索已经产生了关于早期Apple TV和DAAP协议的过时结果,这些协议看起来与我想要的不同.
我的iPad应用程序使用此处讨论的技术向Apple TV呈现第二个UI - 即,检测并绘制到代表Apple TV的UIScreen:
该文件还讨论了接收远程控制事件:
使用AirPlay时,您的媒体可能正在从主机设备的另一个房间播放.AirPlay输出设备可能有自己的控件或响应Apple遥控器.为了获得最佳用户体验,您的应用应该监听并响应远程事件,例如播放,暂停和快进请求.启用远程事件还允许您的应用响应插入主机设备的耳机或耳塞上的控件.
我已经实现了他们描述的方法,以便在我的应用程序和简单的测试项目中开始接收远程控制事件,但我无法检测到任何事件.当我使用直接插入iPad的耳机时,我没有收到任何事件,当我向Apple TV发送视图时,我没有收到任何事件.
我得出的结论是,实际上,拦截远程控制事件的唯一方法是将流媒体流式传输到Apple TV,而不是简单地呈现应用UI或镜像.
这种假设似乎是通过使用MixerHost示例应用程序(如下步骤测试支持http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html):
还有其他人在Airplay和遥控事件方面有更好的运气吗?建议?