尝试在 iOS 13 或 tvOS 13 中使用 AVPictureInPictureController 时出错

Posted

技术标签:

【中文标题】尝试在 iOS 13 或 tvOS 13 中使用 AVPictureInPictureController 时出错【英文标题】:Getting error when trying to use AVPictureInPictureController in iOS 13 or tvOS 13 【发布时间】:2020-02-25 10:37:41 【问题描述】:

我有一个在 ios 和 tvOS 上运行的小应用程序,我在 UIView 中显示视频。它确实支持 iOS 12 和 tvOS 12。 现在想为 tvOS 显示 PIP,因此尝试使用 AVPictureInPictureController 会出现错误“使用未声明的标识符 'AVPictureInPictureController”。

即使部署目标设置为 tvOS 13。在 Xcode 中,功能 -> 背景模式 -> 启用“音频、Airplay 和画中画”。 这个基本代码给出了错误。

#import <AVKit/AVKit.h>
if ([AVPictureInPictureController isPictureInPictureSupported]) 
   // code 

是否缺少任何其他设置或我需要做的其他事情?

谢谢

【问题讨论】:

【参考方案1】:

创建一个简单的视频播放器

首先,您需要在项目的 ViewController.m 文件中实现一个基本的视频播放器,如下所示:

#import "ViewController.h"

#import <AVKit/AVKit.h>

@interface ViewController ()
@property(nonatomic) AVPlayerViewController *playerViewController;
@end

@implementation ViewController

- (void)viewDidLoad 
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];

  // Create a stream video player.
  AVPlayer *player = [[AVPlayer alloc] init];
  self.playerViewController = [[AVPlayerViewController alloc] init];
  self.playerViewController.player = player;

  // Attach video player to view hierarchy.
  [self addChildViewController:self.playerViewController];
  self.playerViewController.view.frame = self.view.bounds;
  [self.view addSubview:self.playerViewController.view];
  [self.playerViewController didMoveToParentViewController:self];


@end

如需进一步帮助,请通过https://help.apple.com/xcode/mac/8.0/#/dev51a648b07

【讨论】:

【参考方案2】:

由于实施差距导致的问题的可能性:

体验 AVPlayerViewController: 最初确保我们设置了播放音频类别,一般当我们使用 AVPlayerViewController 播放视频内容时。如果开发的应用程序进入后台,将自动调用 PIP 模式,但前提是满足下面提到的条件,第一个是我们正在使用的播放器应该是全屏模式,第二个是我们应该确保视频应该是在其中播放,第三个是 PIP 应该由设备支持,最后编写委托方法以在用户从画中画模式返回时恢复我们的播放器 UI。

使用 _AVPictureInPictureController 实现: 您可以在下面的线程中找到一个工作示例。 How to display AVPictureInPictureController?

深入研究问题: 为了确认未声明的错误不是由于实现中的差距,而是由于 Xcode 中的 environmnet,下载源代码,然后将 Sources 文件夹添加到工作区的另一个文件夹中。使用“添加文件到 .. ." 选项,现在在 xcode 中进行验证。

XCODE 刷新可能导致问题 尝试通过方法 1 修复 在标题和/或正文中显式包含该类 - 而不是 *.pch 文件。那么这个错误可能会消失。有时也可以删除派生数据。您最近是否更改了偏好中的位置。有些人在将 ramdisk 用于派生数据然后返回默认值时会出现此错误。这是最烦人的情况——因为它会导致这个错误出现在几乎每个文件中。

尝试修复方法 2 有时,一个简单的解决方案可能有助于从 pch 文件中删除其中的 #import 行并重新编译,这将按预期失败。然后将删除的行放回原处,重新编译并正常编译,所有错误错误都消失了。

XCODE 错误缓存可能出现问题, 请按照以下步骤操作 清理构建:Command-Option-Shift-K 清理构建文件夹。 重置模拟器:选择 iOS 模拟器 > 重置内容和设置 重启 Xcode 删除 ~/Library/Developer/Xcode/DerivedData 中的 DerivedData 文件夹 重启电脑

以非常有针对性的方式删除 /var/folders。 rm -rf "$(getconf DARWIN_USER_CACHE_DIR)/org.llvm.clang/ModuleCache"

来源: How to Empty Caches and Clean All Targets Xcode 4 and later Xcode "Use of undeclared identifier" errors, compiles/runs just fine Use of undeclared identifier in Xcode 9.0 https://developer.apple.com/documentation/avkit/adopting_picture_in_picture_in_a_standard_player

【讨论】:

【参考方案3】:

tvOS 不支持,如 Apple 的 documentation 中所述

SDK

iOS 9.0+

macOS 10.15+

Mac Catalyst 13.0+

【讨论】:

也尝试过导入 AVFoundation.. 还是一样的错误。 -是的..刚刚尝试过..仍然是同样的错误。我认为 tvOS13 不支持“AVPictureInPictureController”(不确定)。 不,不是,请查看我更新的答案。抱歉,我认为它会在 iOS 上给出错误 根据这个链接 - developer.apple.com/documentation/avkit/… - 看起来有可能实现它(再次不确定) 首先确保你设置了播放音频类别,一般在使用 AVPlayerViewController 播放视频内容。如果开发的应用程序进入后台,将自动调用 PIP 模式,但前提是满足 montioned 条件。我们使用的播放器应该处于全屏模式,视频应该在其中播放,并且设备应该支持 PIP,最后编写委托方法以在用户从 PIP 模式返回时恢复我们的播放器 UI。视频应该在其中播放,并且设备应该支持 PIP。来源:shorturl.at/AEXY8

以上是关于尝试在 iOS 13 或 tvOS 13 中使用 AVPictureInPictureController 时出错的主要内容,如果未能解决你的问题,请参考以下文章

iOS之深入解析Xcode 13(iOS 15)正式版发布的新特性

Xcode 13 正式版发布,来看看有什么新特性

tvOS 上的 iCloud 同步

iOS 13.3.1 和 macOS 10.15.3 更新发布!

Xcode 9 启动图像集没有任何适用的内容,tvOS/iOS

如何确保构建使用 v14.x iOS/tvOS 模拟器?