Swift tvOS 13 top shelf-NSExtensionPrincipalClass`product_module_name.ContentProvider`必须至少实现一个公共协议

Swift tvOS 13 top shelf-NSExtensionPrincipalClass`product_module_name.ContentProvider`必须至少实现一个公共协议,swift,xcode,tvos,Swift,Xcode,Tvos,将tvOS分段式顶部托架从使用现已弃用的TVTopShelfProvider迁移到TVTopShelfContentProvider会导致启动时出现NSException 错误“NSExtensionPrincipalClass product\u module\u name.ContentProvider必须至少实现一个公共协议”表明我的类“ContentProvider”必须使用协议。是一个类,而不是一个协议 看看苹果的,你可以看到它们也只是子类TVTopShelfContentProvid

将tvOS分段式顶部托架从使用现已弃用的
TVTopShelfProvider
迁移到
TVTopShelfContentProvider
会导致启动时出现
NSException

错误“NSExtensionPrincipalClass product\u module\u name.ContentProvider必须至少实现一个公共协议”表明我的类“ContentProvider”必须使用协议。是一个类,而不是一个协议

看看苹果的,你可以看到它们也只是子类
TVTopShelfContentProvider

最简单的例子:

class ContentProvider: TVTopShelfContentProvider {

    override func loadTopShelfContent(completionHandler: @escaping (TVTopShelfContent?) -> Void) {
        requestMediaItemsIfNeeded {
            let itemCollection: TVTopShelfItemCollection = TVTopShelfItemCollection(items: self.items)
            itemCollection.title = "Collection Title"

            let sectionedContent: TVTopShelfSectionedContent = TVTopShelfSectionedContent(sections: [itemCollection])
            completionHandler(sectionedContent)
        }
    }

}
顶架相关信息列表值:

<key>NSExtension</key>
<dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.tv-top-shelf</string>
    <key>NSExtensionPrincipalClass</key>
    <string>$(PRODUCT_MODULE_NAME).ContentProvider</string>
</dict>
NSExtension
NSExtensionPointIdentifier
com.apple.tv-top-shelf
NSExtensionPrincipalClass
$(产品\模块\名称)。ContentProvider

我是否缺少需要添加/更新的项目配置值?创建了一个新的最小顶部机架扩展,这些看起来是唯一需要的更改。

我可以通过删除顶部机架扩展目标、配置和构建方案来解决这个问题。然后,我重新创建了顶部机架扩展目标


这显然是一个极端的解决方案。不幸的是,目前还不清楚确切的问题是什么。当一个新的顶层扩展被创建并添加到父目标时,我怀疑苹果在幕后做了一些“魔术”。查看差异不会暴露任何可能的问题。

要迁移顶层机架映像实现以支持全屏资产,应更新两件事:

  • 更新Info.plist。注意更新NSExtensionPointIdentifier
  • productType
    更新为“com.apple.product type.app extension” 我在Xcode中找不到这个设置,所以我在文本编辑器中打开了这个项目,并搜索了
    productType

  • 我可以通过将扩展类型从
    tv-app-extension
    更改为普通的
    app-extension
    来解决这个问题。删除目标也完全适用于我。