尝试在 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)正式版发布的新特性
iOS 13.3.1 和 macOS 10.15.3 更新发布!