You need to enable JavaScript to run this app. Swift如何实现带启停按钮的锁屏与通知中心实时秒表通知
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 13:54:05