MPPlayableContentDataSource 调用不一致

Posted

技术标签:

【中文标题】MPPlayableContentDataSource 调用不一致【英文标题】:MPPlayableContentDataSource called inconsistently 【发布时间】:2017-08-31 13:16:28 【问题描述】:

我正在努力实现对 CarPlay 音频应用的支持,并尝试在模拟器中显示列表。我实现了MPPlayableContentDataSource,但是发现调用不一致。它在应用程序第一次在模拟器上启动时被调用,如果 CarPlay 在启动时打开,我可以通过向上滚动一个空列表来显示第一个项目以触发重绘。 然而,CarPlay 似乎无法调用数据源,在随后的启动中,我看到一个空白屏幕或一个微调器,后面跟着消息 Unable to connect to "AppName"。我尝试了不同的方法,但要点如下:

application: didFinishLaunchingWithOptions:

self.contentDataSource = [[MYContentDataSource alloc] init];
self.contentDelegate = [[MYContentDelegate alloc] init];
MPPlayableContentManager *contentManager = [MPPlayableContentManager sharedContentManager];
contentManager.dataSource = self.contentDataSource;
contentManager.delegate = self.contentDelegate;
[contentManager beginUpdates];
[contentManager endUpdates];

我玩过内容管理器的 beginUpdates endUpdatesreloadData 方法,但这些方法都不会导致实际调用内容数据源。

我已经在数据源中实现了numberOfChildItemsAtIndexPathcontentItemAtIndexPath,它们似乎被正确调用,尽管只是在新模拟器上首次启动应用程序时。

要点:

- (NSInteger)numberOfChildItemsAtIndexPath:(NSIndexPath *)indexPath 
    return 3;


- (MPContentItem *)contentItemAtIndexPath:(NSIndexPath *)indexPath 
    NSUInteger categoryId = [indexPath indexAtPosition:0];
    MPContentItem *contentItem = [[MPContentItem alloc] initWithIdentifier:[NSString stringWithFormat:@"CAT-%lu", (unsigned long)categoryId]];
    contentItem.title = [NSString stringWithFormat:@"Category %lu", (unsigned long)categoryId];
    contentItem.subtitle = @"Subtitle";
    contentItem.playable = NO;
    contentItem.container = YES;

我也尝试过保留(或不保留)对MPPlayableContentManager 的引用。

我在实际的主机上具有相同的行为。任何帮助将不胜感激。

【问题讨论】:

请在bugreport.apple.com 提交错误报告。附加您的项目(或示例项目)。重现问题并在模拟器仍在启动时运行xcrun simctl diagnose,然后将输出附加到错误报告中。 感谢您的注意 - 我能够在实际主机上重现该行为,因此它不是模拟器错误 - 可能是我代码中某处的错误。我将尝试构建一个示例项目来确认,如果它没有重现,则提交一个错误。目前正在处理另一个项目,但很快就会回到这个项目。 如果您仍需要帮助,我很乐意与您交谈,我有使用 CarPlay 的经验。请与我们联系。 【参考方案1】:

我的头在墙上撞了半天,我得到了苹果的以下答复。事实证明,CarPlay 需要 MPRemoteCommandCenterMPNowPlayingInfoCenter 才能工作。

1. Start responding to MPRemoteCommandCenter events at app launch
2. Set the MPNowPlayingInfoCenter dictionary at app launch

These are required for MPPlayableContentDataSource to function correctly.

文档中提到了它们,但不清楚目录显示是否需要它们。这解决了问题。

【讨论】:

步骤 1 和 2 不需要在屏幕上显示内容项。一旦您触摸了可播放的内容项目,它们就需要显示正在播放的信息中心 (2) 并响应播放按钮 (1)。您应该设置正在播放的信息键以响应委托方法 playableContentManager:initiatePlaybackOfContentItemAtIndexPath:completionHandler。

以上是关于MPPlayableContentDataSource 调用不一致的主要内容,如果未能解决你的问题,请参考以下文章