iOS10新特性之CallKit开发详解:锁屏接听和来电识别
国庆节过完了,回家好好休息一天,今天好好分享一下CallKit开发。最近发现好多吃瓜问CallKit的VoIP开发适配,对iOS10的新特性开发和适配也在上个月完成,接下来就分享一下VoIP应用如何使用CallKit后台、锁屏接听和号码识别功能。
一、首先使用CallKit能做什么:(一句话,不仅让VoIP应用具有系统电话一样的功能,还能帮助系统实现来电识别等功能)
1.后台或锁屏时直接通过系统电话界面接管VoIP语音来电,并更新回调电话操作到app(包括接听、挂断、暂停/保留、静音、DTMF信息等等);
2.电话黑名单拦截和来电识别拓展功能(这个大家在安卓XX手机管家、卫士上司空见惯了)
二、看看CallKit的API类簇功能吧:
1、CXCall:电话信息基类,有一个唯一识别符UUID,是系统用以区分一个唯一来电信息的东西、通过这个ID可以地位到特定时刻的特定号码的来电信息。
2、CXCallUpdate:通话过程就是信息和状态的变化过程,CallKit的作用只是在于将通话状态和信息在系统接听界面和应用之间传递 ,通过provider请求进行处理;
3、CXAction/CXCallAction:电话操作载体类,细分包括(电话开始:CXStartCallAction、 接听:CXAnswerCallAction、暂停:CXSetHeldCallAction、静音:CXSetMutedCallAction、群组电话CXSetGroupCallAction、双频多音功能:CXPlayDTMFCallAction、挂断或拒接:CXEndCallAction )。
4、CXTransaction:操作执行类;CXCallController:话务控制器,每种action在配置好CXTransaction后都需要控制器CXCallController去向系统发起请求来响应操作:- (void)requestTransaction:(CXTransaction *)transaction completion:(void (^)(NSError *_Nullable error))completion;
5、CXProvider/CXProviderDelegate:使用CallKit代接收来电状态的VoIP应用都需要一个初始化一个CXProvider,比如有来电时通过provider告知系统帮我接听、要呼出电话时告知系统这条电话的基本信息、以及各种操作和状态的更新信息会通过协议代理传回应用;并需要设置一个代理类来接受处理CXProviderDelegate 代理任务操作(各种CXAction:接听、挂断、DTMF、免提等本地操作)。使用之前,通过 CXProviderConfiguration来配置app的具体信息(你的VoIP 自己的显示名称、是否要支持视频通话、最大会话分组数、logo、来电提示音等信息),以便在系统通话界面显示。
6、CXCallObserver可以设置一个代理来随时捕获电话信息的更新;
7、******接下来是app extension相关的API类:CXCallDirectory电话的地址,目前只有号码CXCallDirectoryPhoneNumber;CXCallDirectoryExtensionContext:拓展应用中用来接受黑名单号码信息和号码识别信息数据源的类;
三、如何使用和需要哪些:
1、初始化一个CXProvider、CXCallController,看看API,配置好代理,准备接受CXCallUpdate;每一种CXCallAction对应一个CXTransaction去执行,因为他有一个管理队列/// Add the provided action to the receiver's list of actions - (void)addAction:(CXAction *)action;
//无论何种操作都需要 话务控制器 去 提交请求 给系统
//无论何种操作都需要 话务控制器 去 提交请求 给系统
-(void)requestTransaction:(CXTransaction *)transaction
{
[_callController requestTransaction:transaction completion:^( NSError *_Nullable error){
if (error !=nil) {
NSLog(@"Error requesting transaction: %@", error);
}else{
NSLog(@"Requested transaction successfully");
}
}];
}
2、告知系统外呼一个电话的信息
请求系统代为接听来电:
- (NSUUID *)reportIncomingCallWithContact:(XWContact *)contact completion:(XWCallKitCenterCompletion)completion
{
NSString * number = contact.phoneNumber;
CXHandle* handle=[[CXHandle alloc]initWithType:CXHandleTypePhoneNumber value:number];
NSUUID *callUUID = [NSUUID UUID]; CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
callUpdate.remoteHandle = handle;
callUpdate.localizedCallerName = contact.displayName;
[self.provider reportNewIncomingCallWithUUID:callUUID update:callUpdate completion:completion];
return callUUID;
}
3、系统听话记录或者联系人里通话发给app,app如何接受这个NSUserActivity,并发起点VoIP电话请求;
4、至于做这个号码识别和黑名单拦截就更简单了,你在工程中添加CallDiretoryExtension拓展的时候,它就帮你写好代码了,看懂了自定义数据源就可以了。不过这个功能多数情况没效果,大概是西塘bug吧。
5、另外iOS10已经警告VoIP功能的应用去使用PushKit来接受来电推送,以往的VoIP后台申请不受支持。具体代码很简单,跟remote notification差不多:PKPushRegistry看看API就知道怎么耍了。
******分享这些一来来是回答网友的问询,二来自己总结一下思路清晰点;不喜欢发代码和Demo ,授之以鱼不如授之以渔,自己看懂了自己写个demo跑一下比看别人写的再规范的demo都好,但是如果还是有需要下次再发简版demo。
随手写的,欢迎指正,欢迎交流,微博:_viviwu_;简书 QQ:286218985;
原创文字,转载必须注明原文链接。
iOS10新特性之CallKit开发详解:锁屏接听和来电识别的更多相关文章
- C#7.0新特性和语法糖详解
转自IT之家网--DotNet码农:https://www.ithome.com/html/win10/305148.htm 伴随Visual Studio 2017的发布,C#7.0开始正式走上工作 ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- 【repost】H5的新特性及部分API详解
h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...
- C++11中新特性之:initializer_list详解
C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用 ...
- EasyPR--开发详解(6)SVM开发详解
在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...
- 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程
产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- opencart 模块开发详解
opencart 模块开发详解 由 xiekanxiyang » 2013年 7月 11日 10:17 pm opencart 将页面分成若干模块, 每个模块可以有多个实例(可能这样说不是很恰当) 每 ...
- iOS应用开发详解
<iOS应用开发详解> 基本信息 作者: 郭宏志 出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...
随机推荐
- Intel® Threading Building Blocks (Intel® TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图
https://www.threadingbuildingblocks.org/docs/help/index.htm Parallelizing Data Flow and Dependency G ...
- web跨域解决方案
阅读目录 什么是跨域 常用的几种跨域处理方法: 跨域的原理解析及实现方法 总结 摘要:跨域问题,无论是面试还是平时的工作中,都会遇到,本文总结处理跨域问题的几种方法以及其原理,也让自己搞懂这方面的知识 ...
- 迁移至个人blog
该博客的部分内容已迁移至个人站点:http://dxjia.cn/ 这里后续不再维护,欢迎访问新站点.
- Android 5.1 AOSP 源码获取
本文已同步更新至:http://dxjia.cn/2015/08/android-aosp-code-sync/ Android 5.1源码开放有一个多月啦,但由于城墙的关系,每次想着更新最新源码学习 ...
- 如何优雅的在MFC中使用cvSetMouseCallback?
MFC与opencv的cvSetMouseCallback用起来感觉很不兼容. 大部分时候,用cvSetMouseCallback也许只是为了获取一个矩形框,或者绘制一个点,或者其它什么简易的图形,通 ...
- [原]unity5 AssetBundle打包
本文unity版本5.1.3 一.现有的打包教程: 1.http://liweizhaolili.blog.163.com/blog/static/16230744201541410275298/ 阿 ...
- ExtJS远程数据-本地分页
背景 一般情况下,分页展示是前端只负责展示,后台通过SQL语句实现分页查询.当总数据量在千条以下,适合一次性查询出符合条件的所有数据,让前端页面负责分页也是一种选择. 实例 现通过ExtJS 4扩展类 ...
- [PaPaPa][需求说明书][V1.0]
前 言 嘿嘿!嘿嘿!嘿嘿嘿嘿!大家好,我是XXX! 经过30K大大几篇文章在博客园怒刷存在感之后,咱们的小群瞬间从70人的数量增加到了将近400人.一下子加进来这么多人我还真是有点不适应啊! 我知 ...
- 【学】SoapExtension 学习
http://msdn.microsoft.com/zh-cn/library/System.Web.Services.Protocols.SoapExtension_methods(v=vs.80) ...
- php常见小知识总结
1.如果在函数中 unset()一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调unset() 之前一样的值.如果是想把全局变量清空,用$var = array(),注意在他之前别用u ...