irpas技术客

iOS 需求 埋点(播放15秒,30秒记录)_观看时长 积分 埋点_冯汉栩

大大的周 2852

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。 前言

记录一下开发中的需求解决办法。

正题

最近接手工作的音乐app的项目,有一个需求就是当用户自然播放(凑够)15,30秒就记录用户的播放记录上存的服务器(埋点)。

我接手的时候上一个人已经写好了,他当时用一个计数器NSTimer,开始播放的时候,计数器开始,每隔一秒就加一,足够15秒就埋点,这样子的话就存在很多问题,我本来在他的基础上去修噶BUG的,后来发现这种设计存在非常多的问题。使得代码很累赘,东写一点,西写一点。

存在的问题

下面我说一下存在的问题: 1.歌曲播放,开启定时,如果歌曲一旦卡顿需要缓存,计时器会不停计时,但是当前由于卡顿歌曲是没有在播放不应该计时的,如果计时器设置成跟随停止的话是可以的。但是歌曲又开始播是不知道,没有监听的方法,什么时候开始计时不太好控制。

2.选择上一首或者下一首的时候,时间累积清0.计数器暂停,开始也可以,重启也是可以的。但是方法需要写在按键触发的地方,很累赘。

3.拖拽滚动条的时候不应该,计时。松手拖拽的时候也不一定计时,可能歌曲还没有缓存到这里。

4.播放点击停止按键不应该计时。等开始播放才计时,这样又要新建多好记得属性去标记当前的状态(注意:写代码的时候,尽量少用属性去标记app运行时的状态,来去控制代码的逻辑。1.这样显得代码很累赘,东写一点,西写一点,不好管理,2.下一个人接手你的代码阅读性很差,不知道你为什么开发时定下这个属性的作用3.尽量使用系统提供的监听方法,属性,去解决问题)

5.timer.suspend() 连续执行两次会崩掉,timer.resume()连续执行两次会崩掉. 注意控制,不过不好控制,应该没有timer当前是否在计时的状态。

6.当前歌曲一旦埋点,计数器移除,节省资源

如果一个需求使用不合理的开发方案,出现了很多的bug,在他的基础上去修复只会越修越烂。

解决办法:

其实这个需求有一个很简单的解决办法,代码可以封装一个方法里面20行代码左右就能解决上面的左右问题。

主要是用下面的代理: 这个代理方法时,当歌曲播放时,就会进来把position给我们去做UI的处理,例如刷新播放时间,滚动条滚动进度。

前一个同事用的是阿里云封装的播放器(AliyunPlayer),就算用系统,豆瓣的也会有这个方法的。只是名称不一样而已。

func onCurrentPositionUpdate(_ player: AliPlayer!, position: Int64)

每次记录播放的时间,把旧的时间跟当前的时间相减,得出来的结果是1秒的说明是自然播放的,如果不是一秒就是拖拽滚动条的,这个代理方法,歌曲不播放不会进来的。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #观看时长 #积分 #埋点