音频配置 & iPhone X的适配

前言

打5岁从出生地——浙江回到老家四川后,至今也没有出过省了!也渐渐忘了坐长途火车的“刺激”感受了,不过在去往南京实习的路上让我找回了那久违的“酸爽”——彻夜难眠!选择这种出行方式的最直接原因是经济,还有就是到达时间问题。如果是坐动车的话,是凌晨一两点到站,这个时间点估计只有睡大街了!

初到某个陌生的环境需要优先解决的就是住宿问题,唉!怪自己之前没有好好“勘察”公司周围的环境,致使找租房时各种绕路各种乱走。最后选定的这处地方时常有些让人睡不好觉的租客入住,比如深夜放音乐不插耳机的,譬如几个大老爷们“互诉衷肠”,旁若无人地调高音量。最让人恼火的是不听招呼,后面把房东请来才“平息”他们的澎湃激情。还有就是半夜洗衣服的,全自动洗衣机的噪声真不是盖的。或许应了房东老板那句话:“这些人素质太差,没事!你先去睡嘛!”

上面两段文字看上去是发牢骚的话,实际上也的确是无关于主题的废话。我这里只是想提醒要去外地工作的朋友,关于住宿的事情要提前准备。不是有句话叫做“三军未动,粮草先行”嘛,只是就我们来说,“粮草”换成了居住而已!

AV Audio Session

其实,这里没有什么要说的,因为关于这种配置的问题,最好的参考资料就是Apple官方文档,没有比这个更全的了。近期有用户反馈说扇贝听力的句子训练模块的听力音频无法正常播放,最为严重的就是卸载重装都无法恢复正常。更为普遍的反馈描述是有些句子不能重复播放,下一句又能正常播放了。然后我就被指派尝试找出这个问题的原因的任务,因为公司这边一直没能复现这个问题。

起初,我也是胡乱的Google,但是问题的描述就是个让人头疼的问题,搜索出来的结果往往差强人意。 最终,还是投入了Apple官方文档的怀抱中,最终将问题锁定在AVAudioSessionCategory的配置上面。就像官方文档描述的那样,系统默认的AVAudioSessionCategory——AVAudioSessionCategorySoloAmbient已经具备有效的行为了,但同时也强调了大多数情况下我们应当自己配置来实现App所期望的功能,因为默认的音频会话分类是不支持录音的!笔者较为细致的测试了此分类下的播放,大致有如下几点特性:

  • 打断其他App播放,即不支持混音;(相信没有人在学习英语的时候还在播放音乐)
  • 插入 / 拔出耳机,音频都将继续播放;(就Apple的人机交互指南来说,后者这种行为发生时,应暂停音频的播放。酷狗就符合这样的规范。)
  • 被其他播放类App、通知提示打断后,能够在打断结束后自动恢复播放;
  • 被录音器打断,点击播放音频也能从断点出恢复播放;
  • 能被响铃 / 静音调控播放状态,并能通过音量键实时调节播放音量;(所谓实时是指在播放的过程中能够根据音量键来增减播放音量,而有些分类只能在开始播放时获取系统的音量状态来确定音频的播放的音量值,中途不能被调整,比如:AVAudioSessionCategoryPlayAndRecord

所以问题的源头就能够大致确定为被打断后的恢复异常,又经过一系列的打断测试,最终发现:当快速地连续点击QQ进行录音发送语音消息时,就能够复现用户所出现的问题。有点戏剧性的感觉是这个问题在使用微信进行相同操作是不会出现的,原因可想而知。

如果是使用系统默认的音频会话类别,该问题则不会出现。而如果此时要进行录音的话,我们可能都会选择的类别是AVAudioSessionCategoryPlayAndRecord。由上文可知这种配置方式下,对音频的播放不是很友好的。所以一个简单而有效的配置方式是:在播放状态,使用系统的默认音频会话分类。在录音状态,切换成可以录音的分类,并在结束后切回系统默认的状态。

Safe Area

众所周知的是Safe AreaiOS 11后为了适配iPhone X并向下兼容提出来的新概念,这方面的资料相信不难搜索到。这里笔者做一个简单的归纳:

  • 如果是使用Xib/Storyboard来开发界面,只需要开启Safe Area Layout Guide这一选项,并将UI元素的边界约束条件依赖于Safe areatop/leading/bottom/trailing即可。后者是对之前的界面布局的调整,如果是在Xcode 9中,只要开启了Safe area,就会出现一个灰色的区域,此时在这个区域内构建界面元素,就可以自动适配了,并可以向下兼容,即在iOS 11以下的系统自动切换成top / bottom Layout Guide
  • 如果是使用代码布局的话,只有写出两套代码来适配不同的系统了。当然也有一些取巧的手段,不过是治标不治本而已。比如说将上边界依赖于导航栏的高度,下边界标签栏(如果有)的高度。因为就iPhone X来说,Safe area带来的最直观的感受就是导航栏变高 24 点(安全区的顶部值为 24 点,竖屏),标签栏变高 34 点(安全区的底部值为 34 点,竖屏)。你觉得这么做会有什么后果呢?

在适配iPhone X的过程中,最让人头疼的就是硬编码问题!因为之前的导航栏和标签栏的值是固定的 64 点和 49 点,很长时间没有变动过,竟致使我们相信它将一直不会变化。Apple之前也就说过,系统会自动调整导航栏和标签栏。如果我们的界面元素依赖的导航栏、标签栏高度的值是动态获取的,那我们的适配工作可能就只剩下底部的Safe area适配了。(除了游戏类App,通常不会考虑iPhone的横屏。)所以我们在编写代码时要有居安思危的忧患意识,即使现在看起来有些好笑。

总结

进入一个全新的环境,难免有些不安和不适应。特别是工作状态的明显改变,让我有些手足无措和精神疲惫。以致于让我在闲暇时间不想接触技术的东西,美其名为工作劳累之后的放松其实心里清楚地知道它与放纵只有一字之差。劳逸结合,要先有劳,然后再有逸。我们作为一个技术人,总是需要忍耐住寂寞并努力坚持着。

To be continue!

扩展资料

AVAudioSession Guide

你可能需要为你的 APP 适配 iOS11

iOS 11 safeArea详解 & iphoneX 适配

你可能感兴趣的:(经验教训,音频配置,iPhone-X适配)