如何解决屏幕保护程序结束后音频继续播放
我正在开发带有(可选)音频的屏幕保护程序。但是每当我通过滑动鼠标将其停用时,音频会继续播放几秒钟。但是,在系统首选项中单击预览时不会发生这种情况。我的理论是,在预览中移动鼠标时,屏幕保护程序进程会立即被终止,但当它没有将其作为预览运行时则不会。有没有办法通过运行一个函数来感知鼠标活动并自己停止音频? 我在下面提供了一些代码: https://gist.github.com/MaxTechnics/3d4280fabc4da53b6df1022864d1bf23 如果需要,将提供更多。提前致谢!
更新:这是我认为问题的主要部分,因为音频永远不会及时停止
// MARK: - Lifecycle
extension VideoView {
override func startAnimation() {
super.startAnimation()
manager.player.play()
}
override func stopAnimation() {
super.stopAnimation()
manager.player.pause()
}
}
解决方法
经过一番折腾,虽然我们无法拦截键盘(也不应该可靠地检测到退出),但实际上可以在屏幕保护程序中收听一些分布式通知,告诉我们用户何时登录,并使用调用我们的代码来停止动画/声音,因为在我们被有效杀死的那一刻和用户回到桌面的那一刻之间存在相当大的延迟。
我确实在此答案中找到了一些事件:Monitoring Screensaver Events in OSX,虽然有些过时,但这些事件仍然会被触发,并且可以在屏幕保护程序内拦截,尽管存在沙盒。我确实发现了一些新的,尽管它们可能对其他目的很有趣。
无论如何,这对我有用:
class AerialView: ScreenSaverView {
...
func setNotifications {
DistributedNotificationCenter.default.addObserver(self,selector: #selector(AerialView.willStop(_:)),name: Notification.Name("com.apple.screensaver.willstop"),object: nil)
}
@objc func willStop(_ aNotification: Notification) {
NSLog("############ willStop")
// Put your stop audio/animation code here
}
}
(您必须自己调用 setNotifications 或将该代码放在其他地方)。
实际上,当屏幕保护程序退出时,有多个事件一个接一个地触发:
com.apple.screensaver.willstop
com.apple.screensaver.didstop
com.apple.screenIsUnlocked
com.apple.screenLockUIIsShown
这是这些事件的一些日志
2021-04-27 14:52:00.564 : ############ screenLockUIIsShown
2021-04-27 14:52:01.873 : ############ screenIsUnlocked
2021-04-27 14:52:01.873 : ############ willStop
2021-04-27 14:52:01.879 : ############ didStop
第一个事件是当我按下一个键时,大约 1.5 秒后手表解锁解锁屏幕,您可以看到连续触发 3 个事件。
在这种情况下,屏幕保护程序的实际终止仅发生在 14:52:07。
为了完整起见,一些新事件用于检测登录 UI 何时启动和关闭(可能对其他一些事情有用)。这是在 11.4 中,我不知道这些事件是否在以前版本的 macOS 中被触发。按发射顺序:
com.apple.shieldWindowRaised
com.apple.screenIsLocked
com.apple.screenLockUIIsShown
com.apple.screenLockUIIsHidden
com.apple.shieldWindowLowered
com.apple.screenIsUnlocked
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。