uni-app 监听屏幕录屏通知(ios)问题:IOS16先播放视频后开启录屏,暂停功能出现异常
uni-app 监听屏幕录屏通知(ios)问题:IOS16先播放视频后开启录屏,暂停功能出现异常
以下代码是我监听录屏后停止视频播放的代码,在IOS16中出现了如下问题,页面时nvue
KJScreenCapture.addScreenCapturedDidChangeNotification(result => {
if (result === 'true') {
this.videoContext.pause()
uni.showToast({
title: '系统检测到您正在录屏,视频将暂停播放',
icon: 'none'
})
}
});
出现问题的场景如下:
环境 | 测试条件 |
---|---|
IOS16 | 测试证书,真机安装 |
- 打开视频详情页,自动播放,
- 开启录屏
- 正常提示了,视频按钮也变为了暂停,但是视频还在播放,如果代码中加上setTimeout就正常
1 回复
在iOS 16中,针对uni-app监听屏幕录屏通知并实现视频播放控制的问题,特别是当先播放视频后开启录屏功能时出现的暂停异常,我们可以通过原生代码扩展的方式来实现更细致的控制。由于uni-app本身是一个跨平台框架,它依赖于原生插件来处理一些平台特定的功能。以下是一个基于iOS原生代码的解决方案示例,展示如何通过Swift编写一个插件来监听屏幕录屏通知,并据此调整视频播放状态。
步骤一:创建iOS原生插件
-
创建插件项目:在Xcode中创建一个新的Cocoa Touch Framework项目,命名为
ScreenRecordingListener
。 -
实现录屏监听:
import UIKit
import AVFoundation
@objc(ScreenRecordingListener)
class ScreenRecordingListener: NSObject {
static let shared = ScreenRecordingListener()
private override init() {}
var isScreenRecordingActive: Bool = false {
didSet {
NotificationCenter.default.post(name: Notification.Name("ScreenRecordingStatusChanged"), object: nil, userInfo: ["isActive": isScreenRecordingActive])
}
}
deinit {
NotificationCenter.default.removeObserver(self)
}
func startListening() {
NotificationCenter.default.addObserver(self, selector: #selector(handleScreenCaptureNotification(_:)), name: UIApplication.didFinishLaunchingNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleScreenCaptureNotification(_:)), name: UIScreen.capturedDidChangeNotification, object: nil)
}
@objc func handleScreenCaptureNotification(_ notification: Notification) {
isScreenRecordingActive = UIScreen.main.isCaptured
}
}
步骤二:在uni-app中集成插件
-
编译插件:在Xcode中构建
ScreenRecordingListener
框架,生成.framework
文件。 -
集成到uni-app:将生成的
.framework
文件放到uni-app项目的native-plugins
目录下,并在manifest.json
中配置插件。 -
调用插件:在uni-app的JavaScript代码中监听自定义通知,调整视频播放状态。
plus.runtime.onMessage('ScreenRecordingStatusChanged', (event) => {
const isActive = event.payload.isActive;
if (isActive && yourVideoPlayer.isPlaying()) {
yourVideoPlayer.pause();
} else if (!isActive && !yourVideoPlayer.isPlaying()) {
// 根据需要决定是否恢复播放
}
});
注意
- 确保在App启动时调用插件的
startListening
方法。 - 由于iOS平台限制,录屏状态的变化可能无法在所有情况下即时反映,特别是在应用进入后台或特定系统行为发生时。
- 上述代码仅为示例,实际项目中可能需要考虑更多的边界情况和错误处理。