iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14,基于 AVPictureInPictureController,实现自定义画中画,涵盖所有功能与难点。

市面上的各种悬浮钟和提词器的原理都是基于此。

Demo源码在文末。

使用 iOS 画中画的要求:

  1. 真机,不能使用模拟器;
  2. iOS 14 及以上;
  3. 开启后台模式:

技术点:​​​​​​​

  1. 添加任意 view 到画中画窗口;
  2. 按需隐藏系统的快进快退按钮、播放按钮、进度条;
  3. 用代码动态修改画中画窗口的形状,横向、竖向 or 方形;
  4. 用代码旋转画中画窗口;
  5. 基于常驻线程的线程保活措施,让你的画中画永不停歇;
  6. 拍照和录视频不会中断画中画;
  7. 拍摄视频画中画的 timer 也不会停止;
  8. 高精度 timer;
  9. 用代码控制进入后台自动开启画中画;
  10. 如何应对苹果的审核。

演示视频:

核心功能:

1. 如何添加自定义 view 到画中画窗口?​​​​​​​

Dart 复制代码
func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
    // note this is first window
    if let window = UIApplication.shared.windows.first {
        window.addSubview(customView)
        // use autoLayout
        customView.snp.makeConstraints { (make) -> Void in
            make.edges.equalToSuperview()
        }
    }
}

2. 如何隐藏系统的快进快退按钮、播放按钮、进度条?

Swift 复制代码
pipController.setValue(1, forKey: "controlsStyle")

3. 如何用代码动态修改窗口的形状?

窗口的形状由视频的形状决定。

4. 如何用代码旋转窗口?

详见demo源码。

5. 如何在录视频时不暗屏?

详见demo源码。

6. 如何让画中画在后台一直运行?

播放无声音频。

7. 如何进入后台时自动开启画中画?

AVPictuerInPictureController 提供了一个属性:

Swift 复制代码
if #available(iOS 14.2, *) {
    pipController.canStartPictureInPictureAutomaticallyFromInline = true
} else {
    // Fallback on earlier versions
}

注:播放器必须处于播放状态。

8. 如何监听画中画窗口变大变小?

KVO,监听画中画里view大小的变化;或者直接在 layoutSubviews 方法里处理。

9. 如何在画中画开启时,让 app 自动进入后台?

调用下面方法:

Swift 复制代码
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)

10. 如何提升悬浮秒表的精度?

使用 GCD Timer。

最后,如何应对苹果的审核?

苹果可能会因为你使用了后台权限而拒绝你。

可能是因为它没看到你使用了画中画功能,录屏告诉它你使用了画中画,画中画必须依赖 Background Mode.

如果这样还不行,在你的 App 里添加视频播放功能,顺带开启视频播放器的画中画功能,有了能开启画中画的视频播放器,你就可以理所当然的使用 Background Mode 了。

如何快速添加视频播放功能?用 iOS 自带的视频播放器 class 啊。

也可以用一个 web,在 web 里放视频播放器。

视频播放器放什么?实在不知道放什么就放你们产品的画中画使用教程吧。

引申出的骚操作:如何给让 App 可以一直在后台运行?

  • 问:如何让你开发的 App 可以一直在后台运行?

  • 答:后台放无声音频就阔以咯。

  • 问:后台放无声音频需要 Background Mode,审核阔能不通过。

  • 答:给你的 App 一个可以正当使用 Background Mode 的理由,比如说视频播放,比如说画中画。

Demo源码:

GitHub - CaiWanFeng/PiP: The best way to customize picture-in-picture for iOS.The best way to customize picture-in-picture for iOS. - GitHub - CaiWanFeng/PiP: The best way to customize picture-in-picture for iOS.https://github.com/CaiWanFeng/PiP

相关推荐
weixin_403810135 小时前
用 Python 调 EasyClick iOS 免越狱脚本:开放接口对接步骤与参数
ios·iphone
weixin_403810138 小时前
EasyClick iOS 免越狱自动化脚本怎么写:从环境判断到跑通第一个脚本
运维·ios·自动化
weixin_403810139 小时前
不用越狱也能批量控制 iPhone:EasyClick iOS 免越狱脚本实战
ios·iphone
weixin_4038101310 小时前
iOS 自动化脚本怎么输入文字:代理、输入法与快捷指令三级方案
运维·ios·自动化
黑科技iOS上架1 天前
双引擎解决oc/swift开发引用加固难题
开发语言·ios·swift·审核·ios混淆·执行程序差异化
wechatbot8881 天前
企微第三方自动化开发:原生能力无阉割 API 开放平台介绍
后端·ios·微信·企业微信·ai编程·ipad
黑科技iOS上架1 天前
iOS framework/dylib动态库定向加固实战
macos·ios·objective-c·cocoa·审核·ios混淆·执行程序差异化
可乐鸡翅yeah_2 天前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
茶底世界之下2 天前
为什么高精度透明图片上传到 Metal 时,必须把“拷贝像素”与“混合合成”分开
ios
老李IT笔记2 天前
iOS 27 更新延迟只能给 1 到 90 天:两个参数怎么配,配错了会发生什么
ios·智能手机