Swift如何实现带启停按钮的锁屏与通知中心实时秒表通知
实现锁屏直接展示秒表实时状态、带控制能力的可落地方案
核心认知纠正
你之前碰到的自定义内容只有展开后才显示、锁屏通知改不了样式的问题,不是代码写得不对,是从根上选错了技术实现路径——Spotify在锁屏上直接展示实时进度、带一键播放控制的效果,根本不是靠普通通知、通知内容扩展做的,这两类能力从系统规则上就注定达不到目标。
方案一:对接系统原生媒体控制面板(最低成本,和Spotify锁屏效果完全一致)
这是目前实现成本最低、系统兼容性最好的方案,全iOS版本支持,不需要写自定义UI,直接复用系统统一的锁屏媒体控制条:
- 基础配置:秒表启动时,初始化
AVAudioSession,设置类别为playback,将isActive属性设为true——哪怕你的应用没有任何音频播放逻辑,系统也会将这个会话识别为活跃的前台媒体会话,自动在锁屏、通知中心第一级拉起媒体控制条,完全不需要用户展开通知。 - 实时计时展示:调用
MPNowPlayingInfoCenter.default(),通过nowPlayingInfo字典同步秒表的实时数据:将秒表的累计运行秒数赋值给MPMediaItemPropertyPlaybackDuration,将当前已经走过的计时秒数赋值给MPMediaItemPropertyPlaybackTime,每1秒刷新一次字典值,锁屏上的进度条、时间数字就会实时滚动更新,视觉效果和Spotify的播放进度条完全一致。 - 控制能力实现:通过
MPRemoteCommandCenter.shared()注册远程控制事件,将playCommand、pauseCommand的触发回调和秒表的启动、停止逻辑绑定,用户在锁屏上点击系统自带的播放/暂停按钮时,就会直接触发对应的秒表操作,不需要跳转App。 - 收尾逻辑:秒表停止时,记得将
AVAudioSession的isActive设为false,清空MPNowPlayingInfoCenter中的所有配置,避免系统一直残留媒体控制条。
方案二:适配iOS16+实时活动(Live Activity)实现更灵活的自定义交互
如果需要比系统媒体面板更灵活的展示样式(比如加Lap记次、分段计时按钮),可以从iOS16开始适配实时活动能力:
- 展示层:秒表启动时创建对应的实时活动实例,通过WidgetKit将秒表当前的计时数值、自定义按钮渲染在锁屏第一级界面,和系统通知层级并列展示,不需要用户按压展开通知就能看到完整内容。
- 交互层:直接在Widget视图中用
Button组件绑定对应的App Intent,用户在锁屏上点击按钮就能直接触发秒表的启动、停止、计次操作,不需要进入应用。 - 实时刷新:秒表运行过程中,按1-2秒的间隔调用
Activity.update(_:)方法同步最新的计时值,就能实现锁屏上的数字实时更新,刷新过程由系统托管,不会因为应用切后台被系统进程杀掉影响展示。
之前实现路径的问题根源
你之前尝试用UNNotificationContentExtension实现的方案,本质上受系统规则限制:普通告警类通知的锁屏条目、第一级精简横幅,永远只会加载系统默认的标题、副标题、正文字段,不会主动加载扩展的自定义视图。就算你用扩展里的mediaPlayPauseButtonType加了控制按钮,这些内容也只会在用户主动展开通知、扩展视图加载完成后才会显示,永远出现在不了锁屏的第一级条目上,自然达不到Spotify那种直接展示、直接控制的效果。
内容的提问来源于stack exchange,提问作者ofun
相关产品推荐
相关产品推荐

