今天在尝试使用CTCallCenter进行电话监听时,发现一直无法捕获电话状态改变的事件,研究了一番之后找到了解决方案,在这里分享给大家。

首先使用CTCallCenter监听电话的代码如下:

  1. CTCallCenter *callCenter = [[CTCallCenter alloc] init];
  2. callCenter.callEventHandler = ^(CTCall* call) {
  3. if ([call.callState isEqualToString:CTCallStateDisconnected])
  4. {
  5. NSLog(@"Call has been disconnected");
  6. }
  7. else if ([call.callState isEqualToString:CTCallStateConnected])
  8. {
  9. NSLog(@"Call has just been connected");
  10. }
  11. else if([call.callState isEqualToString:CTCallStateIncoming])
  12. {
  13. NSLog(@"Call is incoming");
  14. }
  15. else if ([call.callState isEqualToString:CTCallStateDialing])
  16. {
  17. NSLog(@"call is dialing");
  18. }
  19. else
  20. {
  21. NSLog(@"Nothing is done");
  22. }
  23. };

这是网上一段很通用的代码,而本人这么调用却无法获取电话状态改变的事件,一开始感觉到很奇怪,因为callCenter变量声明了之后,没有设置delegate也没有设置target,那么是如何监听的呢?而且更奇怪的是大家都是用这段代码成功接收到了电话状态的改变。

于是我猜测,一旦发生电话状态改变时,系统会自动监测应用程序中是否声明了CTCallCenter的实例,如果声明了,就调用其中的回调。那么这就很合理了,由于本人在工程中开启了ARC,callCenter在声明之后,一旦离开函数的作用域就被释放掉了(具体原因可参见ARC的原理)。而在未开启ARC之前,是不会被释放掉的。

知道了原因,那么解决方案也很明显了,将callCenter声明为成员变量即可。尝试之后,果不其然,问题解决了。

iOS ARC中CTCallCenter没用,无法监听电话的解决方案的更多相关文章

  1. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...

  2. Android 开发中的View事件监听机制

    在开发过程中,我们常常根据实际的需要绘制自己的应用组件,那么定制自己的监听事件,及相应的处理方法是必要的.我们都知道Android中,事件的监听是基于回调机制的,比如常用的OnClick事件,你了解它 ...

  3. iOS监听电话来电、挂断、拨号等

    以下,来讲解在app内如何调用打电话功能和监听电话来电.挂断.拨号等功能. 简单的UI布局: 首先,先实现拨打电话的功能,以便于后续测试: // 拨打电话 - (IBAction)dialingBut ...

  4. 洛谷 P2025 脑力大人之监听电话

    P2025 脑力大人之监听电话 题目背景 画外音: (声明:不要管前面那个,纯属意外,现已经重新编题,绝对原创) 上次海选,我们选出了参赛者中的20%参加本次比赛,现在我们将进行第二轮的筛选,这次的比 ...

  5. iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)

    iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...

  6. vue中给window添加滚动监听无效的解决方案

    原文链接: 点我 页面中有这么一个需求,当页面滚动到一定高度之后,页面中的某些元素进行吸顶,固定到顶部位置,或者是滚动到一定程度进行更新数据的操作.我相信不少网友查阅过类似的资料,网友给出的解决方案, ...

  7. Android应用中返回键的监听及处理

    MainActivity: package com.testnbackpressed;  import android.os.Bundle;  import android.view.KeyEvent ...

  8. Android应用中Back键的监听及处理

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

  9. android脚步---UI界面修改,关于activity中增加按钮和监听

    增加按钮和监听,这个和上个不同在于,它不是在一个dialog里面,而是从新写了一个activity,因此需要先找到这个activity的入口. case R.id.checkframe: if (mC ...

随机推荐

  1. 学习编写Windows Live Writer插件

    1.参考链接 参考:http://www.cnblogs.com/liulun/archive/2009/05/27/1491116.html Live Writer API参考:http://msd ...

  2. nodejs express template (模版)的使用 (ejs + express)

    var app=require("express").createServer(); app.set("view engine","ejs" ...

  3. phpunit测试成功 phpunit测试实践代码

    16:12 2015/12/8phpunit测试成功,代码写在www目录下,以类名命名代码文件,我的文件名为 ArrayTest.php,类名为ArrayTest,内部写了简单的测试代码:<?p ...

  4. AIX日常维护

    1  /etc/security/limits与limit命令 AIX 5.3上 下面是文件/etc/security/limits文件里面有关软限制和硬限制的部分. * * Sizes are in ...

  5. Redis在windows下的安装使用

    下载的windows版本是redis-2.0.2,解压到D盘下: D:\redis-2.0.2 启动Redis服务(conf文件指定配置文件,若不指定则默认): D:\redis-2.0.2>r ...

  6. webdriver中处理alert

    1 定义isAlertPresent()供调用: public  boolean isAlertPresent() {  try {   driver.switchTo().alert();   re ...

  7. HTTP协议及其请求头分析

    HTTP协议及其请求头分析 HTTP协议及其请求头分析   众所周知,Internet的基本协议是TCP/IP协议,目前广泛采用的FTP.Archie Gopher等是建立在TCP/IP协议之上的应用 ...

  8. [CareerCup] 16.4 A Lock Without Deadlocks 无死锁的锁

    16.4 Design a class which provides a lock only if there are no possible deadlocks. 有很多方法可以避免死锁的发生,一个 ...

  9. vim 基础命令

    第一部份:一般指令模式可用的按鈕說明,游標移動.複製貼上.搜尋取代等 移動游標的方法 h 或 向左方向鍵(←)                           游標向左移動一個字元 j 或 向下方 ...

  10. 行业集中度(Concentration Ratio)

    行业集中度是决定市场结构最基本.最重要的因素,集中体现了市场的竞争和垄断程度,经常使用的集中度计量指标有:行业集中率(CRn指数).赫尔芬达尔—赫希曼指数(Herfindahl-HirschmanIn ...