音频配置 & iPhone X的适配

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ZeroOnet/article/details/78455011

前言

打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 适配

10-26

公司app适配起来比较琐碎,很多第三方库编译的时候没有支持模拟器的版本,所以我只好把这些库删掉,然后调试界面后再加进去,是不是听起来就很[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/2.gif][/img]。(我这个女程序媛水平不高没办法)。rnrn适配iPhone X给我带来的最大教训就是:千万不要写死代码,之前用了很多20,49,44,诸如此类的高度,导致我不得一一改掉,而且吧,如果是多人合作的app,一开始就要说好一些常用的变量放在哪,不要每次你加一个,我加一个,不但重复后期还会有很多麻烦产生。rnrn好了,下面说下我适配的过程:rn[color=#0000FF]rn[b]首先适配之前我们要知道5.8英寸的iPhone X到底有什么变化。rn[/b]rn[/color]1.屏幕像素尺寸:1125 * 2436. rn2.开发尺寸:375 * 812 (你懂得),高度比iphone 6,7,8多了145pt。rnrn[img=https://img-bbs.csdn.net/upload/201710/26/1508985139_829982.png][/img]rnrn那么苹果规定的适配准则是:rn1.必须保证布局充满整个屏幕。你设计的产品核心内容不能被“齐刘海”,圆角和底部home指示器遮挡。核心内容要在safearea,如下图的位置。rn(大部分使用标准,系统UI的,比如导航栏,tableView和collections 的,都会自动调整适配iPhone X,但是如果你是自定义控件,那么它的高度什么的都要相应修改才行。)rn[img=https://img-bbs.csdn.net/upload/201710/26/1509001722_327298.png][/img]rnrn2.提供全屏体验。要让你的背景填充整个屏幕,包括指示器的位置。对于像tables和collections,要一直到屏幕最底部。但是要保证指示器的位置不能有有交互性的控件,以免影响用户体验。rnrn3.最基本的内容不能被圆角,“齐刘海”或者home键指示器剪切掉,就是不能被他们遮挡住内容。rnrn4。注意status bar的高度变化。iPhone X中status bar高度比其他所有设备都高。如果之前你代码中是写死20的高度,界面完全用这个高度来布局,那么还是改成动态的status bar的高度吧。现在iPhone X上它的高度可是44pt。rnrn5.加入你之前隐藏了status bar,那么建议在iPhone X上显示出来。现在iPhone X有更高的屏幕,status bar显示的内容对用户是有用的,他最好只在必要的时候隐藏掉。比如看视频或者照片预览。rnrn6.一些图片资源要重新设计。有的图在iPhone X上合适,其他设备可能就会被裁切掉很多,所以要保证设备显示的资源核心内容都在。不会被裁切掉。rnrn7.避免有交互的控件出现在屏幕底部也就是home指示器的位置或者出现在“齐刘海”两边的圆角处。因为底部指示器使用了滑动手势来显示主屏幕,这些手势可能会去掉这些控件的交互。圆角的位置呢对用户使用也不友好。rnrn8.不要尝试用一些黑色的控件填充隐藏掉圆角及指示器的位置。也不要在这些位置加一些奇怪的东西来装饰他们。rnrn9.允许在特定的时候隐藏掉home功能的指示器。但是用户触屏屏幕后,指示器要再次出现。比如播放视频和图片浏览时。rnrn10.tabbar默认高度其他设备是49pt,iPhone X的默认高度是83pt。rnrn[color=#0000FF][b]下面说下我们自己app里面的适配:[/b][/color]rnrn1.status bar高度被写死成20,这次要改成动态获取的。rn[code=objc][[UIApplication sharedApplication] statusBarFrame].size.heightrn[/code]rnrn2.tabbar另一个同事写的自定义的,高度也固定为49,这里也要改,iPhone X上tabbar高度默认是83,其实就是49 + 34,home指示器的高度是34pt。具体就不写了。大家看明白就行。rnrn3.也是其他一些节目的微调,其实改的东西不多,但是很麻烦,特别是有的界面各个控件的高度是根据status bar ,tabbar这些的高度变化的就麻烦了,比较琐碎。rn[color=#FF0000]rn总之,只要遵守上面的一些原则,适配也不是很难。上面的原则是根据苹果适配文档理解翻译的,大家参考。图片也是引用的苹果文档里面的。如果有说的不对的,也麻烦指出。[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/43.gif][/img][/color]rnrnrnrn 论坛

没有更多推荐了,返回首页