callKit框架是ios10之后更新的一个框架,代替了原来的CoreTelephony.framework,使用CallKit可以实现电话的拦截

首先创建一个项目之后,创建一个target,选择Call Directory Extension,会创建一个extension

限制通话的三个方法已经实现但是需要修改,还要在主程序里面添加检测授权的方法和更新电话的代码

一、主程序的代码

检测是否授权,如果想要拦截某个电话,需要在设置界面,设置->电话->来电阻止与身份识别内打开授权,如果用户没有授权需要检测是否授权,可以每隔一段时间检测一下,如果没有授权就提醒一下。

注意ExtensionWithIdentifier这个参数是extension的bundle Identifier
-(void)checkPermissions
{
CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
// 获取权限状态
[manager getEnabledStatusForExtensionWithIdentifier:@"XXXXXX" completionHandler:^(CXCallDirectoryEnabledStatus enabledStatus, NSError * _Nullable error) {
if (!error) {
NSString *title = nil;
if (enabledStatus == CXCallDirectoryEnabledStatusDisabled ) {
title = @"未授权,请在设置->电话->来电阻止与身份识别内授权相关权限"; }
}
}];
}

给主程序添加代码,array是一个数组,里面存放着电话号码,利用NSUserDefaults把数组存放在app group,group的标识要和这里的一致

注意:另外需要注意的是数组必须是升序的,且必须以86开头的
注意:创建NSUserDefaults的时候有个参数是initWithSuiteName:这里要和后面的名称一致
 NSUserDefaults * userDefaults = [[NSUserDefaults alloc]initWithSuiteName:@“XXXXXXXX"];
NSArray *sortedArray = [self.mPhoneNumberList sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2];
}];
[userDefaults setObject:sortedArray forKey:@"blackPhoneNum"];
[userDefaults synchronize];
[self checkPermissions];
[self updateData];

更新需要拦截的电话

-(void)updateData
{
CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
[manager reloadExtensionWithIdentifier:@“XXXXXXX" completionHandler:^(NSError * _Nullable error) {
}]; }

二.extensiond的代码CallDirectoryHandler.m的方法实现

- (BOOL)addBlockingPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context {
NSUserDefaults * userDefaults = [[NSUserDefaults alloc]initWithSuiteName:@“XXXXXXXX"];
NSArray * array = [userDefaults objectForKey:@"blackPhoneNum"];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString * phoneStr = obj;
int64_t phoneInt = [phoneStr integerValue];
CXCallDirectoryPhoneNumber number = phoneInt ;
[context addBlockingEntryWithNextSequentialPhoneNumber:number];
}];
return YES;
} - (BOOL)addIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context {
NSUserDefaults * userDefaults = [[NSUserDefaults alloc]initWithSuiteName:@“XXXXXX"];
NSArray * array = [userDefaults objectForKey:@"blackPhoneNum"];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString * phoneStr = obj;
int64_t phoneInt = [phoneStr integerValue];
CXCallDirectoryPhoneNumber number = phoneInt ;
NSString *label = @"黑名单";
[context addIdentificationEntryWithNextSequentialPhoneNumber:number label:label];
}];
return YES;
}

三.extension和程序之间是不能通讯的,需要利用app group来共享内存,

打开app group的方法,注意需要在主项目和extension都打开并选择同一个标识

TARGETS-->AppExtensionDemo-->Capabilities-->App Groups

利用callKit实现电话防骚扰的更多相关文章

  1. 黑科技,利用python拨打电话,控制手机技术!

    跟selenium操作浏览器原理类似,这是用appium操作移动设备的一个自动化功能,自娱自乐,主要是通过小案例引出相关技术 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很 ...

  2. 利用CRM实现电话营销部门的管控 之数据暂缓

    每个公司都有相应的电话营销部门,有的公司是使用的集中的Call Center,有的公司则是使用简单的销售软件.不同的公司都有各自运行管理的方法. 此篇文章主要是介绍基于微软Dynamic CRM下的自 ...

  3. 使用Redis+自定义注解实现接口防刷

    最近开发了一个功能,需要发送短信验证码鉴权,考虑到短信服务需要收费,因此对此接口做了防刷处理,实现方式主要是Redis+自定义注解(需要导入Redis的相关依赖,完成Redis的相关配置,gs代码,这 ...

  4. 实现全站 HTTPS ,为什么国内网站总是那么slow&&low呀!

    1 https://konklone.com/post/switch-to-https-now-for-free# https://theintercept.com/2014/11/20/non-pr ...

  5. 隐私问题成O2O绊脚石,加强行业监管迫在眉睫

        这年头,O2O的发展越来越给力了.因为O2O能充分结合互联网经济的线上优势和传统经济的线下优势,因此,传统商户纷纷借助O2O来开展业务,取得了不俗的成绩.只是,在移动互联网越来越"开 ...

  6. 苹果应用商店AppStore审核规则指南

    http://www.zesmob.com/blog/40161.html 新应用上架苹果AppStore或重大版本更新时,往往会被拒多次,造成审核不通过的原因,主要是因为对苹果应用商店AppStor ...

  7. iOS开发应用上架必读最新苹果审核规则(史上最全版)

    官方文档 地址https://developer.apple.com/cn/app-store/review/guidelines/ App Store 审核指南 简介 App 正在改变世界,丰富人们 ...

  8. 小众Tox——大众的“去中心化”聊天软件

    ★Tox是什么 一个反窥探的开源项目:一种基于DHT(BitTorrent)技术的即时通讯协议:一个为安全而生的加密通讯系统 .美国棱镜计划曝光后,一个名为 irungentoo 的牛人于17天后的2 ...

  9. 【转】互联网全站HTTPS的时代已经到来

    原文地址:http://blog.csdn.net/luocn99/article/details/39777707 前言 我目前正在从事HTTPS方面的性能优化工作.在HTTPS项目的开展过程中明显 ...

随机推荐

  1. ROJ 1166 超级贞鱼

    1166: 超级贞鱼 Time Limit: 1 Sec  Memory Limit: 128 MB [Submit][Status] 传送门 Description 马达加斯加贞鱼是一种神奇的双脚贞 ...

  2. cocos studio UI 1.6.0.0 修改导出项目路径

    因为cocos studio UI 1.6.0.0版本没有自动修改默认导出路径的功能,新建项目后默认导出的路径还是上一个项目的,每次导出都要重新设置路径很麻烦.于是考虑是否可以找到默认配置文件,终于还 ...

  3. KoaHub平台基于Node.js开发的Koa 连接支付宝插件代码信息详情

    KoaHub平台基于Node.js开发的Koa 链接支付宝插件代码信息详情 easy-alipay alipay payment & notification APIs easy-alipay ...

  4. Python 3 集合基础和概念!

    Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...

  5. 4001: [TJOI2015]概率论

    4001: [TJOI2015]概率论 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 262  Solved: 108[Submit][Status] ...

  6. 1230: [Usaco2008 Nov]lites 开关灯

    1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1162  Solved: 589[Sub ...

  7. H5 Canvas vs. SVG

    HTML 5 Canvas vs. SVG HTML5 SVG HTML5 地理定位 Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的. SVG SVG 是一种使用 XM ...

  8. entity framework core 支持批量插入,值得期待

    entity framework6.x之前搞了这么多版本,构架这么牛B,居然没有批量插入更新的功能,但有很多替换的解决方案,例如Entity Framework Extended Library(ht ...

  9. 【SF】开源的.NET CORE 基础管理系统系列导航

    SF是一套基于ASP.NET Core MVC+EFCore+Bootstrap开发出来的基础管理系统,源代码完全开源,可以帮助你解决C#.NET项目中重复编码的繁琐工作,让开发人员远离加班! SF ...

  10. C++ 头文件系列(string)----分析string初始化内存模型

    测大小 这里我们比较4种版本的basic_string模版类,分别是:string, wstring, u16string, u32string. 虽然他们是不同的字符串类型,但是其sizeof的结果 ...