问题

最近在做一个有录音功能的App,要求当用户接到来电时,要停止录音。该如何实现这个功能呢?

解决方案

我首先想到了AppDelegate里的applicationWillResignActive:方法,在该方法的注释中就写到到收到来电或短信时,系统会自动调用该方法,如下:

// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

但是有个问题,当程序进入后台时,也会调用这个方法,而我的App要求,即使进入后台,也可以继续录音,而在applicationWillResignActive:方法里无法判断是什么原因引起的该方法的调用(可能有方法,但我没搜到,哪位朋友知道的话分享一下),因此这个解决方案行不通。

继续查找资料,最终找到CoreTelephony框架,这个框架包含了电话相关的API,可以实现监测来电,查看运营商信息等功能。见上一篇CoreTelephony框架的博文,下面就是具体的实现监测来电的代码

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import <span class="hljs-title" style="box-sizing: border-box;">"ViewController.h"</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//引入框架</span>
@import CoreTelephony;<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ViewController</span> ()</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">strong</span>) CTCallCenter * center;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ViewController</span></span>- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)viewDidLoad {[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span> viewDidLoad];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.center</span> = [[CTCallCenter alloc] init];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.center</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.callEventHandler</span> = ^(CTCall * call){<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//TODO:检测到来电后的处理</span>};}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul>

这里注意一定要把center写成一个单独的属性,并且是强引用(strong),否则如果在viewDidLoad方法里创建center,viewDidLoad方法调用完后center就销毁了,就无法检测到来电了,千万不要犯这种低级错误。

还有一种方案。使用通知的方式监听AVAudioSessionInterruptionNotification。来电后语音播放会被停止触发中断。通过通知做后续操作。比较简单就不多说了。

iOS中监测来电方案相关推荐

  1. iOS中的HotFix方案总结详解

    iOS中的HotFix方案总结详解 相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dy ...

  2. 在 Android 应用中监测来电信息

    本文讲的是在 Android 应用中监测来电信息, 目标 本文的主要目标是监测 Android 中的来电状态信息. 你想在你的 Android 应用中监测来电状态和来电号码么? 你在处理通话.摘机.空 ...

  3. iOS中内存管理方案

    系统提供的有不同的内存管理方案,大致有如下三种: TaggedPointer (对于一些小对象,比如说NSNumber,NSString等采用此种方案) NONPOINTER_ISA (64位架构下i ...

  4. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  5. android计步器简书,iOS中计步器的实现方案及原理

    前言 当前社会随着社会水平的越来越高,人民饮食也更加的丰富多样,随之而来就成就了越来越多可爱的胖子.胖子多了,一些"不良商贩"发现商机研发出了运动健身类的APP,如:Keep,咕咚 ...

  6. ios 播放不了服务器视频文件流,浅析iOS中视频播放的几种方案

    1.AVPlayer (1) 优缺点 优点:可以自定义 UI, 进行控制 缺点:单纯的播放,没有控制 UI(进度,暂停,播放等按钮),而且如果要显示播放界面, 需要借助AVPlayerLayer, 添 ...

  7. 解决Titanium Tab组件click事件在iOS中不生效的方案

    2019独角兽企业重金招聘Python工程师标准>>> 问题: 以下代码,tab1的click事件在Android中生效,在iOS不生效 1: function Applicatio ...

  8. ios中常用的第三方库

    下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableVie ...

  9. iOS中的3种卡顿检测

    市面上的iOS卡顿分析方案有三种:监控FPS.监控RunLoop.ping主线程. 前面2个都比较熟悉,第三个是最近才了解到的. 方案一:监控FPS 一般来说,我们约定60FPS即为流畅.那么反过来, ...

最新文章

  1. php 如何发送json数据格式,Php如何使用curl发送json格式数据实例
  2. liunx的目录结构
  3. php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...
  4. 双数组 实现 Trie
  5. 开心哲理---您的妻子! --转by yp
  6. ABAP development tools实现原理介绍
  7. 1.C#WinForm基础制作简单计算器
  8. 类型和原生函数及类型转换(一)
  9. 公司聚餐完毕,明日启程回家过年
  10. 每天一道博弈论之“巴什博弈”
  11. linux2.6.34编译安装,ubuntu 10.04 编译安装最新版本linux-2.6.34内核
  12. MySQL数据库设计-案例
  13. 一个简单的轮播图代码
  14. 渗透测试工程师面试题大全(一)
  15. BugKu CTF(杂项篇MISC)---哥哥的秘密
  16. SpringBoot Banner 图片定制修改
  17. attr 与prop 的区别
  18. 韩信点兵python程序_韩信点兵计算公式与代码
  19. Java中的类、方法、属性的命名规则
  20. 庄思浩先生在清华大学的演讲(2002)

热门文章

  1. 科创板开户手续费要2万元,大家怎么看?
  2. 2013电赛总结【西电专用】
  3. 行业发展的大势所趋 嵌入式机器视觉系统前景一片大好
  4. android linux kernel VS standard linux kernel
  5. html5图像映射坐标怎么看,如何将AxesImage中的坐标映射到已保存图像文件中的坐标?...
  6. java jai create 方法_使用JAI扩展Java Image的功能
  7. vtune mysql user_intel vtune 介绍、安装和使用
  8. GPU Gems1 - 12 全方位的阴影映射
  9. less中的for循环
  10. 为什么mysql 5.7.24启停不显示错误信息?log-error_verbosity参数