iOS 10 CallKit 的简单使用
来源:互联网 发布:淘宝店铺怎么设置运费 编辑:程序博客网 时间:2024/06/07 10:39
CallKit 这个开发框架,能够让语音或视讯电话的开发者将 UI 界面整合在 iPhone 原生的电话 App 中.将允许开发者将通讯 App 的功能内建在电话 App 的“常用联络资讯”,以及“通话记录”,方便用户透过原生电话 App,就能直接取用这些第三方功能;允许用户在通知中心就能直接浏览并回覆来电,来电的画面也将整合在 iOS 原生的 UI 里,总体来说,等于让 iOS 原本单纯用来打电信电话的“电话”功能,能够结合众多第三方语音通讯软件,具备更完整的数码电话潜力。CallKit 也拓展了在 iOS 8 就出现的 App Extensions 功能,可以让用户在接收来电时,在原生电话 App 中就透过第三方 App 辨识骚扰电话(例如诈骗).
如何创建一个call项目?
出现下图结构说明创建成功:
来电提醒功能
通过extension模板,创建CallDirectoryExtension
用到的方法:
//开始请求的方法,在打开设置-电话-来电阻止与身份识别开关时,系统自动调用- (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context;//添加黑名单:根据生产的模板,只需要修改CXCallDirectoryPhoneNumber数组,数组内号码要按升序排列- (BOOL)addBlockingPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context;// 添加信息标识:需要修改CXCallDirectoryPhoneNumber数组和对应的标识数组;CXCallDirectoryPhoneNumber数组存放的号码和标识数组存放的标识要一一对应,CXCallDirectoryPhoneNumber数组内的号码要按升序排列- (BOOL)addIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context;
实现流程
在打开设置里的开关后,系统会调用beginRequest方法,在这个方法内部会调用添加黑名单和添加信息标识的方法,添加成功后,再调用completeRequestWithCompletionHandler方法通知系统;
代码的实现:
- sms:或者是sms://:发送短信;
- tel: 或者是tel://:打电话
- telprompt:或者是 telprompt://: 打电话;
- mailto:发送邮件;
- http:或者是 http://: 浏览网址;
打电话的按钮
NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",self.noTextField.text]; [self.callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]]; if (!self.callWebview.subviews) { [self.view addSubview:_callWebview]; }
检查授权:
CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance]; // 获取权限状态 [manager getEnabledStatusForExtensionWithIdentifier:@"com.tq.cccccccccalldemo.CallDirectoryExtension" completionHandler:^(CXCallDirectoryEnabledStatus enabledStatus, NSError * _Nullable error) { if (!error) { NSString *title = nil; if (enabledStatus == CXCallDirectoryEnabledStatusDisabled) { /* CXCallDirectoryEnabledStatusUnknown = 0, CXCallDirectoryEnabledStatusDisabled = 1, CXCallDirectoryEnabledStatusEnabled = 2, */ title = @"未授权,请在设置->电话授权相关权限"; }else if (enabledStatus == CXCallDirectoryEnabledStatusEnabled) { title = @"授权"; }else if (enabledStatus == CXCallDirectoryEnabledStatusUnknown) { title = @"不知道"; } UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示" message:title 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]; } }];
CallDirectoryHandler文件的实现方法:
注意:
电话号码前要加区号:+86;电话号码需要升序排列(Numbers must be provided in numerically ascending order.)
/** 添加黑名单:无法接通 */- (BOOL)addBlockingPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context/** 添加信息标识 */- (BOOL)addIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context
说明:
将项目运行到真机之后,还需要在“设置->电话”设置应用的权限;
项目基本可以达到需求了!黑名单的号码打进来是在通话中,标记的号码显示标记的名字;
这时你会发现你只有第一次运行项目的号码设置才起作用,或者是去设置里面重新授权;显然这是不行的;我们需要实时更新号码:
CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance]; [manager reloadExtensionWithIdentifier:@"com.tq.cccccccccalldemo.CallDirectoryExtension" 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]; } }];
在使用reload时容易出现的问题:
1:出现 Error Domain=com.apple.CallKit.error.calldirectorymanager Code=1 "(null)" CXErrorCodeCallDirectoryManagerErrorNoExtensionFound 该错误可能出现的原因是identifier 设置的不对 注意不要使用app groups 使用的是Call Directory Extension 的identifier
2:出现 Error Domain=com.apple.CallKit.error.calldirectorymanager Code=4 "(null)" CXErrorCodeCallDirectoryManagerErrorDuplicateEntries该错误可能出现的原因是:存入的手机号 有重复 检查后去除重复号码
3:出现 Error Domain=com.apple.CallKit.error.calldirectorymanager Code=6 "(null)" CXErrorCodeCallDirectoryManagerErrorExtensionDisabled该错误可能出现的原因是:未开启权限 在设置中->电话->来电阻止与身份识别 开启就行
- iOS 10 CallKit 的简单使用
- CallKit的使用介绍
- iOS10--CallKit的简单应用
- iOS10--CallKit的简单应用
- iOS10:CallKit的简单应用
- CallKit iOS 教程
- callKit
- iOS 初探PushKit集成与CallKit集成
- iOS CallKit来电标签和电话拉黑
- iOS UIScrollView的简单使用
- IOS progressview的简单使用
- ios UISlider 的简单使用
- iOS UISegmentedControl 的简单使用
- iOS UIPageControl的简单使用
- iOS UIActivityIndicatorView的简单使用
- iOS UIImageView的简单使用
- iOS通知的简单使用
- iOS NSTimer的简单使用
- React-Native_02:语法篇
- WritePrivateProfileString和GetPrivateProfileString读写ini配置文件
- lists这个类无法使用maven打包
- 编程之美2.18--数组分割(动态规划问题)
- DroiBaaS云服务再获权威认可,顺利通过可信云评估
- iOS 10 CallKit 的简单使用
- java--Object
- nim博弈
- 使用Gradle管理你的Android Studio工程
- (转载)First and Follow Sets(编译原理)
- java值传递和引用传递总结
- hive学习笔记第三部分
- 获取属性的各个部分的内容(权限修饰符变量类型变量名)
- Afinal 下载功能errorNo=0 下载失败