利用callKit实现电话防骚扰
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实现电话防骚扰的更多相关文章
- 黑科技,利用python拨打电话,控制手机技术!
跟selenium操作浏览器原理类似,这是用appium操作移动设备的一个自动化功能,自娱自乐,主要是通过小案例引出相关技术 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很 ...
- 利用CRM实现电话营销部门的管控 之数据暂缓
每个公司都有相应的电话营销部门,有的公司是使用的集中的Call Center,有的公司则是使用简单的销售软件.不同的公司都有各自运行管理的方法. 此篇文章主要是介绍基于微软Dynamic CRM下的自 ...
- 使用Redis+自定义注解实现接口防刷
最近开发了一个功能,需要发送短信验证码鉴权,考虑到短信服务需要收费,因此对此接口做了防刷处理,实现方式主要是Redis+自定义注解(需要导入Redis的相关依赖,完成Redis的相关配置,gs代码,这 ...
- 实现全站 HTTPS ,为什么国内网站总是那么slow&&low呀!
1 https://konklone.com/post/switch-to-https-now-for-free# https://theintercept.com/2014/11/20/non-pr ...
- 隐私问题成O2O绊脚石,加强行业监管迫在眉睫
这年头,O2O的发展越来越给力了.因为O2O能充分结合互联网经济的线上优势和传统经济的线下优势,因此,传统商户纷纷借助O2O来开展业务,取得了不俗的成绩.只是,在移动互联网越来越"开 ...
- 苹果应用商店AppStore审核规则指南
http://www.zesmob.com/blog/40161.html 新应用上架苹果AppStore或重大版本更新时,往往会被拒多次,造成审核不通过的原因,主要是因为对苹果应用商店AppStor ...
- iOS开发应用上架必读最新苹果审核规则(史上最全版)
官方文档 地址https://developer.apple.com/cn/app-store/review/guidelines/ App Store 审核指南 简介 App 正在改变世界,丰富人们 ...
- 小众Tox——大众的“去中心化”聊天软件
★Tox是什么 一个反窥探的开源项目:一种基于DHT(BitTorrent)技术的即时通讯协议:一个为安全而生的加密通讯系统 .美国棱镜计划曝光后,一个名为 irungentoo 的牛人于17天后的2 ...
- 【转】互联网全站HTTPS的时代已经到来
原文地址:http://blog.csdn.net/luocn99/article/details/39777707 前言 我目前正在从事HTTPS方面的性能优化工作.在HTTPS项目的开展过程中明显 ...
随机推荐
- Yii前台后台登录混淆问题
我们在用yii开发项目时候,如果前后台使用modules实现 那么 做登录时候用户名就会出现前后台登录混淆的事情 于是可以在adminModule.php文件中做个设置 public function ...
- HTML,login文本框·
列子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- linux网络编程1 最简单的socket编程
下面是socket编程的服务器端 先看一个图,1 #include<stdio.h> #include<stdlib.h> #include<string.h> # ...
- selenium 运行之后错误提示Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output
错误提示: org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port ...
- JS入门(二)
关于运算符: js中判断运算符跟数学的运算符基本差不多,就是大于>,小于<,大于等于>=,小于等于<=,等于==,不等于!=,全等于===:可以看出来,跟我们印象中的判断运算符 ...
- MySQL优化四(优化表结构)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- 重回博客 谈一谈Node中的异步和单线程
重回博客,这个帐号之前注册后就只发了一篇博客.听朋友建议,决定一周两次更新. 第一篇谈论一下最近想的比较多的异步的问题. 传统多线程异步 传统的异步是多线程的,当要同时做两件事的时候,他们是执行在不同 ...
- 4063: [Cerc2012]Darts
4063: [Cerc2012]Darts Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 85 Solved: 53[Submit][Status] ...
- DAX/PowerBI系列 - 参数表(Parameter Table)
DAX/PowerBI系列 - 参数表(Parameter Table) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★☆(4星) 概况: 这个模式比较简单灵活,而且很实用.所用的DAX语句也比较简 ...
- Android 一个改善的okHttp封装库
膜拜一下~ 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49734867: 本文出自:[张鸿洋的博客] 一.概述 之前写了篇A ...