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

Dan*_*orm 7 xcode swift tvos

将 tvOS 分段式顶部架子从使用TVTopShelfProvider(现已弃用)迁移到启动时会TVTopShelfContentProvider导致NSException启动。

该错误NSExtensionPrincipalClass product_module_name.ContentProvider must implement at least one public protocol表明我的类ContentProvider必须使用协议。TVTopShelfContentProvider是一个类,而不是一个协议。

查看 Apple 的示例项目,您可以看到它们也仅子类化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)
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

顶部货架相关的 Info.plist 值:

<key>NSExtension</key>
<dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.tv-top-shelf</string>
    <key>NSExtensionPrincipalClass</key>
    <string>$(PRODUCT_MODULE_NAME).ContentProvider</string>
</dict>
Run Code Online (Sandbox Code Playgroud)

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

Via*_*hko 5

要迁移顶级图像实现以支持全屏资产,应更新两件事:

  1. 更新Info.plist。注意更新NSExtensionPointIdentifier

信息表

  1. 更新productType为“com.apple.product-type.app-extension”我在 Xcode 中找不到此设置,因此我在文本编辑器中打开该项目并搜索productType


Dan*_*orm 3

我可以通过删除 Top Shelf 扩展目标、配置和构建方案来解决此问题。然后我重新创建了 Top Shelf 扩展目标。

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