IOS-电话拦截
IOS10的电话拦截理念与android不一样,基于隐私保护的理念IOS没把对方号码送给应用,因此需要反过来由app把需要识别或拦截的电话存入系统数据库。这一功能通过Call Directory Extension模块实现(具体操作请见https://blog.csdn.net/sinat_30336277/article/details/54944057,或者https://www.jianshu.com/p/e3d0acda8dda),通过在Blocking和Indentification两个相关的方法中进行黑名单生成及识别号码的生成。用户在设置->电话->来电阻止与身份识别界面下开启应用的该项功能时,Extension应用的beginRequestWithExtensionContext方法会被系统调用。通过在addAllBlockingPhoneNumbersToContext函数里实现了某些固话号码段的屏蔽。这样实现的屏蔽号码,在设置界面下是看不到。
需要注意的问题:
1、电话号码要加国别、区号、升序排列、唯一,xcode默认生成的代码有问题,正确号码格式应该如:+8618907311234、+8673122126000。可参见:https://blog.csdn.net/Rex_xing/article/details/78184598
2、系统电话簿优先级高于此方法设置的识别号码,也就是同时有设置的情况下只会显示号码簿里面的姓名。
3、黑名单拦截的来电不会在历史通话中显示。
4、在按需更新号码的时候要注意如果插入了重复号码会失败(Extention模块中系统不会返回错误信息,只是在宿主进程的reloadExtensionWithIdentifier时返回错误),因此采取全量更新的办法。每次先调用removeAllIdentificationEntries,然后再插入。当然也可以在每个号码插入前先调用removeIdentificationEntryWithPhoneNumber。
5、使用sqlite3的时候,号码字段一定要记得采用bigint,我就是因为采用了int类型导致插入号码时好时坏。
6、号码的别名一定不要太长。之前犯糊涂,别名字段设置了个varchar(128),库中有大量的长度为三四十个字符的记录,结果总是报更新失败,又不知道原因。由于获取不到有效的调试信息,百思不得其解,熬了好几个夜才在一次偶然的情况下看到内存不足的信息,才慢慢发现这个问题。
7、另外,有个奇怪的、一直未能找到原因的现象:由于采用sqlite的数据库文件作为本地资源(懒得从网络更新),但插入该文件到工程中后很诡异的出现Extention不能运行,时好时坏,坏的时候连重装app都不灵。不过在后期使用中没再碰到过该问题。
下面是我的屏蔽多个号码段的代码:
CXCallDirectoryPhoneNumber allPhoneNumbers[] = { +, +, +, +, +, +, +, + };
NSUInteger count = (sizeof(allPhoneNumbers) / sizeof(CXCallDirectoryPhoneNumber));
for (NSUInteger index = ; index < count; index += ) {
CXCallDirectoryPhoneNumber phoneNumber = allPhoneNumbers[index];
for(int i=;i<;i += ){
[context addBlockingEntryWithNextSequentialPhoneNumber:phoneNumber+i];
}
}
每次通过设置来触发号码修改不方便,可以通过在宿主应用中主动触发Extension来刷新。在宿主应用中合适的位置(更行了号码数据后)调用下面的函数updateNumber,触发Extension的CallDirectoryHandler类的beginRequestWithExtensionContext方法(context.isIncremental为true)。xcode的示例代码会调用addOrRemoveIncrementalBlockingPhoneNumbersToContext和addOrRemoveIncrementalIdentificationPhoneNumbersToContext来更新号码。其中"xxx.qrcode.phone"是Extention应用的Bundle Identifier
- (void)updateNumber{
CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
[manager reloadExtensionWithIdentifier:@"xxx.qrcode.phone" completionHandler:^(NSError * _Nullable error) {
if (error == nil) {
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示"
message:@"更新成功"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}else{
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示"
message:@"更新失败"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
}];
}
此外,还有几个功能没尝试:
1、检查用户授权。参见:https://blog.csdn.net/qq_26918391/article/details/52913028、https://blog.csdn.net/qq_30513483/article/details/52768699?locationNum=1
2、实时监听来电。如:https://www.2cto.com/kf/201607/525336.html、https://blog.csdn.net/gf771115/article/details/46649115、https://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653578016&idx=2&sn=ae1474cbc3037e5c00e6da5c69cd8569&chksm=84b3b127b3c43831191d37ca0e86d2f2f7b97d180d8c0ccd6dedb9c4a9a9a8c0af909d28d558&scene=4#wechat_redirect
3、与宿主应用间数据共享(Extension与主应用是两个应用,主应用的获取的数据如果需要传递到extension,得用到appgroup)。如:https://blog.csdn.net/Rex_xing/article/details/78184598、https://www.jianshu.com/p/7f8472a97aa6
IOS-电话拦截的更多相关文章
- Android广播接收者应用(电话拦截器)
一.电话拦截器应用说明 在我们输入完电话号码并拨打电话时,系统会发出一个有序广播(action="android.intent.action.NEW_OUTGOING_CALL") ...
- Android短信拦截和电话拦截
MainActivity: package com.wyl.bctest; import android.support.v7.app.ActionBarActivity; import androi ...
- 微信iOS消息拦截插件教程-Tweak HelloWorld
微信iOS消息拦截插件教程-Tweak HelloWorld 标签(空格分隔): 越狱开发教程 1.环境准备 准备一台越狱的手机,具体参照上一篇教程 搭建Theos越狱开发环境 2.开发过程 新建一个 ...
- Android电话拦截实现以及TelephonyManager监听的取消
由于毕业设计题目涉及到电话拦截这一块.所以鼓捣了一下.遇到了一些问题,总结一下,以免忘记,也希望能帮助其他新人们. 本篇博客目的:实现电话的拦截 会遇到的问题:android studio下AIDL的 ...
- Android开发——短信电话拦截/接听电话
1.短信拦截 首先需要声明的是,Android4.4版本以上,如果想做到短信拦截,必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常 ...
- android143 360 短信电话拦截
package com.itheima.mobileguard.services; import java.lang.reflect.Method; import android.app.Servic ...
- iOS # Charles拦截封包
Charles: 是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使得 ...
- Android四大组件应用系列——实现电话拦截和电话录音
一.问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音. 2.设置电话黑名单,当来电是黑名单电话,则直接挂断 ...
- iOS事件拦截(实现触摸任意位置隐藏指定view)
项目里有一个需求,类似新浪或者腾讯微博的顶部title栏的类别选择器的消失(在选择器展开的时候,触摸屏幕任何地方使其消失). 最开始的想法是当这个选择器(selectorView)展开的时候,在当前屏 ...
- Android安卓电话拦截及短信过滤
package com.focus.manager; import java.lang.reflect.Method; import Android .app.Activity; import And ...
随机推荐
- Idea创建一个springboot多模块项目
一.创建空Maven项目 二.左边选择maven,右边可以什么不选,直接next: 三.填写artifactId,点击next直到finish 四.finish后,idea会生成如下结果模块,删除sr ...
- 【DWM1000】 code 解密1一 去掉Main 函数多余内容
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 室内定位兴起,DWM1000 作为超宽带UWB的代表,在国内用的越来越多,但是可见资料非常少. 一方面 ...
- 同步方法、同步代码块、volidate变量的使用
当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线程改过了. ...
- Creator 插件商店:高品质插件
资源处理类 资源引用查询 功能:将指定资源拖到目标资源框内并列出所有需要用到该资源的场景以及所在节点 点评:检查一下是否有冗余资源混进来了,尽量减少包体积呀. TexturePacker 碎图提取 功 ...
- Understanding Built-In User and Group Accounts in IIS 7
Understanding Built-In User and Group Accounts in IIS 7 By lzb October 19, 2018 Introduction In earl ...
- 【二分图最大匹配】Bullet @山东省第九届省赛 B
时间限制: 6 Sec 内存限制: 128 MB 题目描述 In GGO, a world dominated by gun and steel, players are fighting for t ...
- 优先队列重载<运算符
https://vjudge.net/problem/POJ-3190 #include<iostream> #include<cstdio> #include<queu ...
- C# ManualResetEventSlim 实现
ManualResetEventSlim通过封装 ManualResetEvent提供了自旋等待和内核等待的组合.如果需要跨进程或者跨AppDomain的同步,那么就必须使用ManualResetEv ...
- OKDownload 下载框架 断点续传 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Win10系统的SurfacePro4的启动菜单太多怎么管理,UEFI的启动菜单如何编辑
有时候多增加了一些硬盘版的PE,会出现下面这种问题,启动项目太多又删不掉(如果你硬盘版的PE修改了文件位置,这个选项还进不去) 关机之后,按开机键和音量+,进入Surface的启动菜单,直接删除原 ...