更新1: 我的问题是:如何扩展现有项目以支持tvOS而不必从头开始构建?
更新2: Jess Bower在Apple网站上指出: “通过在App Store上启用通用购买,使客户能够在iOS和新的Apple TV上享受他们最喜欢的应用程序,并进行单个购买。” 这意味着我们需要在现有项目中创建一个新的bundle并启用“universal”购买,以便它在App Store中计为一个应用程序。
tvOS SDK是基于iOS的,但不可互换。与首款iPad发布时不同,新的Apple TV将无法运行iOS应用程序。
TV的AppStore只包括专为tvOS构建的应用程序。
对于任何希望为Apple TV创建应用程序的iOS开发人员,建议查看新的文档页面:https://developer.apple.com/library/content/documentation/General/Conceptual/AppleTV_PG/index.html#//apple_ref/doc/uid/TP40015241-CH12-SW1
具体来说,请查看Inherited iOS Frameworks部分以了解哪些可以直接从现有iOS项目中使用。
我花了一点时间才找到需要更改的所有内容,但是这个列表应该涵盖了它们。
我认为为 tvOS 添加新目标是正确的选择,特别是当你有许多 Objective-C 或 Swift 代码可以在项目之间共享时。
对于那些可能存在一些不支持 tvOS 的类型的情况,在共享代码中我使用了这些预处理器符号来提供tvOS的替代代码片段:
#if TARGET_OS_IOS
// iOS-specific code
#elif TARGET_OS_TV
// tvOS-specific code
#endif
#if TARGET_OS_IOS const string appDelegateName = "ofxiOSAppDelegate"; #endif
出现错误。明确地说,在Xcode 7.0和Xcode 7.1(tvOS已定义)下,它是完全正常运行的。 - Danoli3#if !defined(TARGET_OS_IOS) || TARGET_OS_IOS
。但是,在旧版 Xcode 上,它会将 OS X 检测为 iOS。 - Cœur以下是一些限制和挑战的列表:
1. 苹果电视上的应用程序没有持久的本地存储,数据必须存储在iCloud上。
2. 苹果电视应用程序的最大大小限制为200MB。应使用按需资源(托管在App Store上的应用程序内容)。好处是应用程序更小并且应用程序资源可以延迟加载。
3. 用户界面有很大的不同。必须按照人机界面指南进行操作,如文档所述。
4. 使用JavaScript和TVML框架创建客户端-服务器应用程序。
5. 控制UI触摸焦点。UIFocusEnvironment可控制视图层次结构分支的焦点相关行为。UIViewController符合UIFocusEnvironment协议。
6. 创建视差艺术品。您必须使用Xcode创建LSR图像,然后使用终端创建LCR图像。UIImage对象可以正确显示LCR图像。
A new target has to be added for tvOS. There are two ways to do that
Pods need to be added to the tvOS target using pod install
. There could be a different list of pods that you can/want to use in tvOS. Pods for different targets can be separated in Podfile using:
target 'iOS TARGET NAME' do
pod 'podname', :git => 'https://github.com/name.git'
end
target 'tvOS TARGET NAME' do
pod 'podname', :git => 'https://github.com/name.git'
end
Most Pods at the moment do not support tvOS. For those Pods, here are the steps to make them work in your project:
If a version of the pod is being used in another target (iOS target), change the name, otherwise CocoaPods will complain: e.g. RestKit --> RestKitTV and use :path In Podfile to point to the location of the cloned repo:
pod 'RestKitTV', :path => 'Other/RestKitTV'
Update the podspec file in the cloned repo:
Change the platform to tvOS or add tvOS to the list of supported platforms
Pod::Spec.new do |s|
..
s.platform = :tvos
..
end
OR
Pod::Spec.new do |s|
..
s.tvos.deployment_target = '9.0'
s.tvos.exclude_files = 'framework/Source/Mac', ....
s.tvos.frameworks = ['OpenGLES', 'CoreMedia', 'QuartzCore']
..
end
Add files to the target:
Use TARGET_OS_TV and TARGET_OS_IOS macros to separate tvOS non-compatible code
#if !TARGET_OS_TV
*iOS only code*
#else
*tvOS only code*
#end
+Simon-Tillson的回答是正确的,但我在使用旧版Xcode(iOS 8.1及以下SDK)时遇到了一些向后兼容性问题,其中TARGET_OS_IOS未定义。
下面的代码修复了这个问题,并且对于iOS 9.0/9.1 SDK +和早期的8.1及以下SDKS都有效。
#if TARGET_OS_IOS || (TARGET_OS_IPHONE && !TARGET_OS_TV)
// iOS-specific code
#elif TARGET_OS_TV
// tvOS-specific code
#endif
在我的项目中,我只需将一个新目标添加到现有的iOS项目中,并适当修改一些代码(在某些区域使用#if os(tvOS/iOS))。现在我能够在iOS设备或Apple TV上运行相同的应用程序。
tvOS中唯一缺少的框架是WebKit(必须用于呈现富文本),我需要想出一种替代机制。
我将很快开源这个项目(在十月底之前),以便其他人可以查看。
不要忘记在构建设置中将基础 SDK 更改为 TVos 9.x。这对于 TV 模拟器的显示是必要的。
UIUserInterfaceIdiom
有一个新的可能取值UIUserInterfaceIdiomTV
。 - livingtech