iOS反骚扰电话-CallKit

iOS10增加了识别骚扰电话的API,有三款主流的软件已经实现。也有一些报道分析 前几天查了查资料,动手写了一个Demo.

原理

电话号码是用Call Directory extension事先存在系统里的,当来电时,系统会查询存储的数据, 根据号码绑定的label,决定直接屏蔽还是显示来电。

iOS-CallKit.png

When using CallKit's Call Blocking & Identification feature (new in iOS
10), phone numbers to be blocked or identified are loaded by your app's
Call Directory extension prior to an incoming call and the phone numbers
are stored by the system. Then, when an incoming call arrives, this stored
data is consulted by the system and an incoming call may either be
blocked or identified in the incoming call UI with the label provided.
For privacy and performance reasons, Call Directory app extensions are
not launched when incoming calls arrive and an app extension cannot
retrieve the phone number for an incoming call

http://stackoverflow.com/questions/38098036/how-to-get-the-incoming-call-number-by-using-callkit
https://www.zhihu.com/question/47542405

步骤

1 . 新建一个工程,New 一个 Target,选Call Directory Extension ,会自动生成模版代码。

  override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        context.delegate = self

        do {
            try addBlockingPhoneNumbers(to: context)
        } catch {
            NSLog("Unable to add blocking phone numbers")
            let error = NSError(domain: "CallDirectoryHandler", code: 1, userInfo: nil)
            context.cancelRequest(withError: error)
            return
        }

        do {
            try addIdentificationPhoneNumbers(to: context)
        } catch {
            NSLog("Unable to add identification phone numbers")
            let error = NSError(domain: "CallDirectoryHandler", code: 2, userInfo: nil)
            context.cancelRequest(withError: error)
            return
        }

        NSLog("beginRequest context ", context);
        context.completeRequest()
    }

    private func addBlockingPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws {
        // Retrieve phone numbers to block from data store. For optimal performance and memory usage when there are many phone numbers,
        // consider only loading a subset of numbers at a given time and using autorelease pool(s) to release objects allocated during each batch of numbers which are loaded.
        //
         let phoneNumbers: [CXCallDirectoryPhoneNumber] = [ +8618005555555, +8618005555555 ]

        for phoneNumber in phoneNumbers {
            context.addBlockingEntry(withNextSequentialPhoneNumber: phoneNumber)
        }
    }

    private func addIdentificationPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws {
        // Retrieve phone numbers to identify and their identification labels from data store. For optimal performance and memory usage when there are many phone numbers,
        // consider only loading a subset of numbers at a given time and using autorelease pool(s) to release objects allocated during each batch of numbers which are loaded.
        //
        // Numbers must be provided in numerically ascending order.
        let phoneNumbers: [CXCallDirectoryPhoneNumber] = [ +8618005555555, +8618005555555 ]
        let labels = [ "骚扰电话", "Local business" ]

        for (phoneNumber, label) in zip(phoneNumbers, labels) {
            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)
        }
    }

2 . 手工给Extension 生成 一个 CallDirectoryExtension.entitlements 文件。
3 . 运行。在设备的设置 —> 电话 —> Call Blocking & Identification,开启我们的 App。
4 . 打电话

效果

IMG_4610.png

API

beginRequest

该方法在 Containing App 调用 reload 或者在 设置 —> 电话 —> Call Blocking & Identification里开启权限的时候,会自动被调用。但是打断点的时候,无法进来。

open class CXCallDirectoryProvider : NSObject, NSExtensionRequestHandling {

    open func beginRequest(with context: CXCallDirectoryExtensionContext)
}

给系统数据库增加骚扰电话号码

    open func addBlockingEntry(withNextSequentialPhoneNumber
phoneNumber: CXCallDirectoryPhoneNumber)
  • 数据量大时,需要分批处理,注意内存问题。consider only loading a subset of numbers at a given time and using autorelease pool(s) to release objects allocated during each batch of numbers which are loaded.
  • 号码升序排列。 Numbers must be provided in numerically ascending order
  • 号码需要加区号。 Edit retrievePhoneNumbersToIdentifyAndLabels() to include the number and label you want. Add +CountryCode at the start (not confirmed yet if this is essential)

给系统数据库增加骚扰电话号码以及提示的文本

    open func addIdentificationEntry(withNextSequentialPhoneNumber phoneNumber:
 CXCallDirectoryPhoneNumber, label: String)

提交

    open func completeRequest(completionHandler completion:
 (@escaping (Bool) -> Swift.Void)? = nil)

苹果开发交流网站上的总结

https://forums.developer.apple.com/thread/48837

I've managed to get this working, here's what I did and
some observations:

1) Create a new target of Type Call Directory Extension.

2) Edit retrievePhoneNumbersToIdentifyAndLabels() to include the number
 and label you want. Add +CountryCode at the start (not confirmed yet
 if this is essential)

3) Run the containing app target.

4) In setting go to Phone/Call Blocking & IdentificationAnd turn on you
extension (or it will automatically be turned on if you run the
 entension target rather than the containing app target)

5) Make a call

Its not possible to hit any breakpoints in the extension if running in
XCode regardless of which target you execute. NSLog statements can be
viewed via XCode's devices, it indicates that the extension is called in
step 4) if the above steps are called. I don't know if/when its called
subsequently after that, it has to be otherwise how can an updated list
 be applied?

If you want to make a change to the label, the OS does caching, so turn
 off the extension, delete the containing app app, clear the call history
 from the phone app, install and run again.
时间: 2025-01-23 15:50:49

iOS反骚扰电话-CallKit的相关文章

WiFi万能钥匙发布iOS4.0新增骚扰电话拦截功能

近日,连尚网络旗下产品WiFi万能钥匙发布了iOS4.0最新版本.根据用户的需求反馈,WiFi万能钥匙iOS4.0新增了骚扰电话拦截等多个功能.版本更新后,WiFi万能钥匙在连接成功率和使用流畅程度上实现了完美跃升,这也是WiFi万能钥匙继iOS3.3.0版本实现"一键免费连接WiFi"后的又一次突破. 在最新的iOS4.0版本中,连接的稳定性.连接速度更进一步提高,用户在使用上能够有明显的连接更为流畅的感受.目前,WiFi万能钥匙的连接成功率接近80%,远高于同行水平.同时,新版本完

国内首份垃圾短信、骚扰电话年度治理报告出炉

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   360手机卫士去年拦垃圾短信712亿条"毒王"号一天遭举报801次 360报告:一年垃圾短信长度绕地球405圈浪费用户时间超过1万年 国内首份针对垃圾短信.骚扰电话问题的年度治理报告出炉.今日,360互联网安全中心发布了<2012年度中国垃圾短信.骚扰电话治理报告>.报告指出:去年360手机卫士累计为2.2亿用户拦截垃圾短信712

深圳商人跟帖“地铁嫦娥”引来上万骚扰电话

羊城晚报讯 记者王志钰报道:几天前,深圳世界之窗地铁站内"嫦娥" 征男友新闻,红爆网络,正当 网友们对此事津津乐道时,竟有人因跟帖遭恶搞.5日,家住深圳宝安的荣先生向记者一吐郁闷,自3日中午起截至5日,已有上万个陌生电话打入他的手机,其中大部分是一打通便挂掉,多数来电不是漫骂就是调侃,一时间,荣先生一家深陷网络恶搞的电话骚扰中. 两日接到上万骚扰电话 荣先生称,他于8月30日在网上看到"地铁嫦娥"的新闻后,就上了相关QQ,转载并跟了一个帖.到了9月3日下午,他的手机

歼灭骚扰电话!三款主流防骚扰软件横评

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 近日,在京华时报上刊登的360手机卫士反骚扰广告引发轩然大波,在报纸A22整个广告版上,所有广告如"急转"."急售"."包治百病"."高价回收"等的联系电话均变成"**"被360手机卫士屏蔽,广告矛头直指制造骚扰电话的众多行业,而这也使骚扰电话

IOS10防骚扰电话设置流程分享

给各位iPhone手机的使用者们来详细的解析分享一下IOS10防骚扰电话的设置流程. 流程分享: iOS10已经在北京时间9月14日凌晨推送至用户手机,相信许多iphone用户已经更新完系统了,系统增加了哪些功能,又修改了哪些细节了,在这里为你挑出重点,说一说iOS10的防骚扰电话功能. 此次iOS10更新最大的亮点就是开放了更多的入口,其中要属电话通讯接口最为重要,此前iOS系统一直被诟病不能防电话骚扰,相信很多人在没有iOS10以前接到过无数个贷款诈骗推销的电话吧,有了这个功能之后不能说完全

本想给孩子找靠谱培训机构,却招来一堆骚扰电话

本想给孩子找一家靠谱的培训机构,万万没想到却招来一堆骚扰电话,李先生郁闷坏了.信息泄露导致被骚扰并非个案,360互联网安全中心发布的<2014年第二期中国手机安全状况报告>显示,二季度收录新标记骚扰电话号码7144万个,广告推销类骚扰电话的号码数占7.1%,总数超过500万.报班惹来一身"骚"半小时接6个骚扰电话"孩子马上就要上初三了,便想给孩子找个暑期的培训班,可没想到招来了一堆骚扰电话."李先生很苦恼.据了解,李先生在网上找了3家中考培训机构的电话进

360手机卫士怎么设置骚扰电话拦截?

  360手机卫士怎么设置骚扰电话拦截? 1.打开手机桌面的360卫士,在常用功能选项页面里有一个"骚扰拦截"设置选项,点击打开. 2.进入之后,会看到"垃圾短信"."骚扰电话"和"拦截设置"三个选项.在页面下面是"一键清空"和"举报短信"两个选项."垃圾短信"中显示的是拦截的所有短信,对不爽的短信进行举报,虽然至今小编没有得到什么反馈. 3.在"骚扰电话&

手机号被误标注成骚扰电话:安全软件帮倒忙

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 现在垃圾短信.骚扰电话很多,让用户不堪其扰,360互联网安全中心的数据显示,今年二季度平均每天新收录骚扰电话号码由一季度的13.2万个增至78.5万个.所以很多用户现在都使用手机安全软件,来识别.拦截骚扰电话. 但并不是所有人都为手机安全软件欢呼,有用户反映,自己正常使用的电话号码被安全软件标示为"骚扰电话",自己打别人电

三星A3怎么防止骚扰电话?三星A3防止骚扰设置教程

防止骚扰设置我们通常是说的广告电话,或者一些骚扰电话了,具体我们以防骚扰电话为例子. 1.进入三星A3界面下[应用程序].     2.点击[设定].     3.在此我们点击[呼叫/信息阻止]选项,打开进入了,细节如下.     4.点击[呼叫阻止]先,因为我们要打开它,默认是关了的.     5.点击[仅阻止已注册号码]如下所示.     6.点击[呼叫阻止列表].     点击[+]图标.     8. 然后我们把不想接听的电话增加到这里面来就可以了,之后点击[保存]即可.