【问题标题】:How to extend iOS app to tvOS如何将 iOS 应用程序扩展到 tvOS
【发布时间】:2015-12-06 00:56:07
【问题描述】:

我有一个需要扩展到 tvOS 的 iOS 应用程序。 我找到的所有信息都在解释如何从头开始! 有什么方法可以将我的应用扩展到 tvOS,或者我应该用它开始一个新项目?

更新1: 我的问题是:如何扩展我现有的项目以支持 tvOS 而无需从头开始构建它?

更新 2: Jess Bower 在 Apple 网站上的观点:

让客户能够在 iOS 和新版本上享受他们喜爱的应用 通过启用通用购买 Apple TV 单次购买 您的应用在 App Store 上。

这意味着我们需要在现有项目上创建一个新的捆绑包并启用“通用”购买,以便将其视为 App Store 上的一个应用程序。

【问题讨论】:

  • 发行说明说(至少现在)“你不能从 iOS 故事板复制对象并将它们粘贴到 tvOS 中”。哎哟!
  • 值得注意的是,UIUserInterfaceIdiomUIUserInterfaceIdiomTV 有一个新的可能值。
  • 我已经成功地完成了包含标签、子视图和图像等的完整视图,从 ios 应用故事板到 tvOS 应用故事板 - 可以做到。但是,我相信支持 UISwitch 或 UIDatePicker 等子视图的视图会有限制 - 这些在 tvOS 上不受支持。我相信向现有 iOS 应用添加新目标是前进的方向。
  • 它不是一个通用的应用程序包。这是一个普遍的购买。这意味着您有 2 个应用程序,一个 iOS 应用程序(可能是手机和平板通用捆绑包)和一个 tvOS 应用程序(这是一个完全不同的构建)。然后他们只是以一个价格将它们出售作为“普遍购买”。

标签: ios apple-tv tvos


【解决方案1】:

tvOS SDK 基于 iOS,但不可互换。与第一代 iPad 发布时不同,新的 Apple TV 将无法运行 iOS 应用程序。

适用于电视的 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

具体来说,请查看继承的 iOS 框架部分,让您了解现有 iOS 项目的开箱即用功能。

【讨论】:

  • 您好,感谢您的回答。你知道关于 TVML 和 Javascript 的全部内容吗?只是构建应用程序的另一种选择吗?因为在 Xcode 中我可以看到这与为 iOS 构建应用程序的过程相同
  • 使用 JavaScript 和 TVML 的客户端-服务器应用程序与其他应用程序略有不同。 Xcode 应用程序的主要功能是访问一个主要的 JavaScript 文件并将从 TVML 文件创建的页面呈现到屏幕上。因此,您可以选择是像在 iOS 上一样创建应用程序还是基于 TVML 的应用程序
  • 您还可以在两个版本和子类中包含 swift 文件以进行区分。
【解决方案2】:

在 Xcode 7.1(引入 tvOS SDK)中,您可以像添加任何其他目标一样添加 tvOS 目标(文件 -> 新建 -> 目标... -> tvOS -> ...),它同时支持 Objective-C 和 Swift ,所以是的 - 可以在您的 iOS 和 tvOS 应用程序之间共享代码,您只需要检查您的源目标成员资格并在您的 tvOS 目标上启用它。要跨 iOS 和 tvOS 应用扩展购买,我们应该使用 Universal Purchases。

【讨论】:

  • 是的,我试过了。我期待像 iPad-iPhone 这样具有不同故事板的东西。但是,如果我为 tvOS 构建,那么该应用程序将具有与 iOS 不同的 ID,它将是一个全新的应用程序,而不是扩展。提交到 iTunes 也是如此
  • 现在创建一个单独的目标。您可以放置​​仅存在于该目标中的代码。我猜测有关应用程序如何通用的更多信息即将发布。
  • 我想我们将能够在 tvOS 目标器上共享相同的包标识符,但正如 @JessBowers 所说 - 我们会看到...
  • 好的,刚刚发现更多。这是通用购买:(不是通用二进制,所以不是同一个捆绑包/可交付):developer.apple.com/tvos“通过在应用商店。”所以再一次,做一个单独的目标
  • 我什至在@JessBowers 之前见过它,但一如既往地对他们在文档中简单句子的解释至关重要:)
【解决方案3】:

我花了一点时间才找到所有需要更改的东西,但这个列表应该涵盖了它。

  1. 点击 iOS 目标并复制
  2. 将新 tvOS 目标的基础 sdk 更改为 tvOS 最新版
  3. 复制 info.plist 并让 tvOS 指向那个
  4. 制作所有 tvOS 图标并启动图像
  5. 为 tvOS 构建设置将 TARGETED_DEVICE_FAMILY 设置为 3
  6. 添加任何新的 tvOS 特定版本的代码,例如没有 shouldAutorotate、prefersStatusBarHidden 等。

【讨论】:

  • demobots 应用程序也是一个很好的检查资源
【解决方案4】:

我还认为,为 tvOS 添加一个新目标是可行的方法,尤其是当您有大量的 Objective-c 或 swift 代码要在项目之间共享时。

对于共享代码中可能存在一些 tvOS 不支持的类型的情况,我使用这些预处理器符号为 tvOS 提供替代代码 sn-ps:

#if TARGET_OS_IOS
// iOS-specific code
#elif TARGET_OS_TV
// tvOS-specific code
#endif

【讨论】:

  • 知道 TARGET_OS_IOS 是何时首次在 iOS SDK 中定义的吗?
  • +Danoli3:我想它从一开始就存在。它以前只为 iOS 版本定义,但最近(我认为是 iOS 8 以来)它总是被定义,并且设置为 0(对于 Mac、Watch 或 tvOS)或 1(对于 iOS),所以你不能使用 # ifdef 来检查它。始终如上使用#if。
  • 我用 travis 尝试了 8.1 SDK,但预处理器跳过了它。示例:travis-ci.org/openframeworks/openFrameworks/jobs/87396739 其中#if TARGET_OS_IOS const string appDelegateName = "ofxiOSAppDelegate"; #endif 失败。需要明确的是,这在 Xcode 7.0 和 Xcode 7.1(tvOS 定义)下运行良好。
  • 我为这些宏值做了一个表格;希望它会帮助别人:gist.github.com/jtbandes/cd8ee0cf139ae4411b41
  • 为了确保 travis,您可以写 #if !defined(TARGET_OS_IOS) || TARGET_OS_IOS。但它会在旧 Xcode 上将 OS X 检测为 iOS。
【解决方案5】:

仅列出一些限制和挑战:
1. Apple TV 上的应用程序没有持久的本地存储。数据必须存储在 iCloud 上。

2. Apple TV 应用程序的最大大小限制为 200MB。应使用按需资源(App Store 上托管的应用内容)。好处是更小的应用程序大小和应用程序资源的延迟加载。

3. 用户界面截然不同。必须遵循人机界面指南per the doc.

4. 使用 JavaScript 和 TVML 框架创建客户端-服务器应用程序。

5. 控制 UI 触摸焦点。 UIFocusEnvironment 控制视图层次结构分支的焦点相关行为。 UIViewController 符合 UIFocusEnvironment 协议。

6. 创建视差图 你必须用 Xcode 创建一个 LSR 图像,然后使用终端创建一个 LCR 图像。 UIImage 对象可以正确显示 LCR 图像。

【讨论】:

  • 这并不完全准确。第1点不正确。第 4 点它只是一个选项,你可以使用 tvOS,你不必使用 TVML。第6点,也是一种选择。而且,这是如何回答这个问题的?
【解决方案6】:
  1. 必须为 tvOS 添加一个新目标。有两种方法可以做到这一点

    • 通过 File > New > File...> tvOS Target 添加新目标。
    • 复制现有的 iOS 目标并将 TARGETED_DEVICE_FAMILY 更改为 3 并将“支持的平台”更改为“构建设置”中的 tvOS
  2. 需要使用 pod install 将 Pod 添加到 tvOS 目标。您可以/想要在 tvOS 中使用的 pod 列表可能有所不同。不同目标的 Pod 可以在 Podfile 中使用:

    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
    
  3. 目前大多数 Pod 不支持 tvOS。对于这些 Pod,以下是使它们在您的项目中工作的步骤:

    • 在本地磁盘上克隆 git 存储库
    • 如果某个版本的 pod 正在另一个目标(iOS 目标)中使用,请更改名称,否则 CocoaPods 会报错:例如RestKit --> RestKitTV 并在 Podfile 中使用 :path 指向克隆的 repo 的位置:

      pod 'RestKitTV', :path => 'Other/RestKitTV'
      
    • 更新克隆仓库中的 podspec 文件:

      • 修改名称以与新名称兼容
      • 将平台更改为 tvOS 或将 tvOS 添加到支持的平台列表中

         Pod::Spec.new do |s|
         ..
         s.platform = :tvos
         ..
         end
        

         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
        
  4. 将文件添加到目标:

    • 将源代码(.m 文件)添加到目标的“构建阶段”的“编译源”中
    • 将图像添加到“复制捆绑资源”
    • 将框架添加到“将二进制文件与库链接”。请注意,并非所有框架都与 tvOS 兼容
  5. 使用 TARGET_OS_TV 和 TARGET_OS_IOS 宏来分隔 tvOS 不兼容的代码

    #if !TARGET_OS_TV
        *iOS only code*
    #else
        *tvOS only code*
    #end
    

【讨论】:

  • 如果我执行步骤 1 和 2,则会创建两个单独的目标。这样做的目的是什么?
【解决方案7】:

+Simon-Tillson 的答案是正确的,但是我在 iOS 8.1 及以下未定义 TARGET_OS_IOS 的 SDK 中遇到了一些向后兼容性问题(对于较旧的 Xcode 版本)

以下代码修复了该问题,并且在 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

【讨论】:

  • 感谢您的澄清。
【解决方案8】:

在我的项目中,我只是在现有 iOS 项目中添加了一个新目标,并适当地修改了一些代码(在一些区域使用 #if os(tvOS/iOS))。我现在可以在 iOS 设备或 Apple TV 上运行相同的应用程序。

tvOS 中唯一缺少的框架是 WebKit(它是呈现富文本所必需的),我需要想出一个替代机制。

我打算尽快(10月底之前)开源这个项目,让其他人可以看看。

【讨论】:

  • 你开源过这个项目吗?
【解决方案9】:

不要忘记在构建设置中将 Base SDK 更改为 TVos 9.x。电视模拟器必须出现

【讨论】:

  • 最好将其保留为评论而不是单独的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多