任务完成提示音时有时无,我们修好了开关藏错地方
最近有用户跟我们抱怨:明明在设置里开了「任务完成提示音」,结果后台跑完的任务还是静悄悄的,偶尔响偶尔不响,摸不着规律。我们顺着这条线一路查下去,发现病根根本不在声音本身,而在那个开关被放错了地方。这篇就把这次排查和修法原原本本讲一遍,给同样被「时有时无」困扰的朋友一个参考。
提示音为什么会被连累?开关藏在了通知权限里
追到最后,真相有点反直觉:那个「任务完成提示音」的开关,代码里被写进了系统通知权限的判断分支里。也就是说,你的声音和通知是绑在一起的——系统一旦拒绝、或者某个系统更新把你的应用通知权限重置了,通知没了,声音也跟着一起没了。
这就像你家门铃和门锁共用一根电线,你只是想关掉敲门提醒,结果门铃也哑了。用户心里想的是「我不想被打扰但我要听到声音」,系统给的却是「要么都有、要么都没有」。
这次的改法很干脆:把声音和通知彻底拆成两条独立的线。只要声音那个开关是开着的,就一定响,跟通知权限无关;通知该怎么走就怎么走,照旧按权限决定。
后台跑完一声不响?原来是只亮灯不响铃
第二个问题是:你在后台或者手机上跑的任务,跑完了本来也是一声不响。以前这条「任务真出结果就提醒你」的路径,代码里只做了「亮个灯」,忘了「响个铃」。
这很容易被当成「没坏」——因为灯确实亮了,界面也确实有变化,只是少了那一声。可恰恰是那一声,才是让你放下手机、知道这活真的干完了的关键。现在我们把这条收口路径补上了:后台、手机上跑完的任务,真的出结果了就会提醒你。
当然,怕它响起来没完,我们也加了三道防刷的闸:只在确实新出一条结果时响一次、只响两分钟内的新鲜回话、同一个会话 30 秒内最多响一次。这样你刷新页面也不会满屏响铃,该响的时候一定响,不该响的时候绝不烦你。
开机起不来?给脚本加了个十二秒的兜底
还有一类更头疼的反馈,来自把软件装在别人电脑上的用户:界面一直提示服务没起来,任务整轮卡住不回话。查到底,是几个问题叠在了一起。
其中一个最有代表性:判断服务状态的代码,本想要一个「是或否」的答案,却拿到了一整个对象,而对象任何时候都算「真」,于是「没起来就把它拉起来」这段代码从来就没执行过。这是一个非常典型的陷阱——把「有返回值」误当成「返回了一个正确的布尔值」。
修完这几处,我们又加了一道兜底:负责拉起服务的小脚本如果 12 秒还没把服务点着,就直接用内置的运行时把它拉起来,不再依赖那个小脚本。实测在带中文的安装路径、加上一个全新的用户目录这种最容易出问题的场景下,修之前一分钟都起不来,修之后 56 秒就能自愈、进入可用状态。
给你自己的三条自查
- 一个「开关」是不是被绑在了另一个不相干的权限上?通知、定位、声音,很多时候本不该共享同一根线。
- 「只亮灯不响铃」的提醒,还叫提醒吗?提醒的闭环,是让用户感知到,而不只是界面变了个色。
- 判断服务状态时,你拿到的是布尔值,还是顺手把整个对象当成了真假?对象永远是「真」,这是最容易漏的一类 bug。
这些能力都是土拨鼠日常在帮你兜的部分,想看它整体还能替你干哪些活,可以翻一下 功能页;如果你在盘算「让它替我扛这些琐事到底值不值」,定价页 有按量的对照;想直接拿一件真事上手试试,下载 装一个,比看十篇说明都直观。
土拨鼠 Marmot