IOS获取来电去电来电归属系统通知达到效果(一)
这里的原理是获得到呼叫系统通知,然后根据本地呼叫电话号码,相应的电话联系.
一世。 来电显示是不是在地址簿中的联系人, 这是当第一个加入一个临时的联系人在您的电话簿(它是创建一个新的接触,并保存相应的RecordID)
情况二 已在通讯录的联系人
然后 把相应本次通话的电话标签改动成归属地字符
原文地址 http://blog.csdn.net/leewolf130/article/details/38921921
好了 ,先看看怎么获取系统电话通知
须要的类
//创建电话对象
代码一:
#import <Foundation/Foundation.h>
@import CoreTelephony;
// private API
typedef NS_ENUM(short, CTCallStatus) {
kCTCallStatusConnected = ,
//已接通
kCTCallStatusCallOut = ,
//拨出去
kCTCallStatusCallIn = ,
//打进来
kCTCallStatusHungUp =
//挂断
};
@interface WCCall :
NSObject
@property (nonatomic,assign)
CTCallStatus callStatus;
@property (nonatomic,copy)
NSString *phoneNumber;
@property (nonatomic,retain)
CTCall *internalCall;
@end
#import "WCCall.h"
@implementation WCCall
@end
//监听电话通知
代码三:
#import <Foundation/Foundation.h>
#import "WCCall.h"
@interface WCCallCenter :
NSObject
// 监听来电事件
@property (nonatomic,strong)
void (^callEventHandler)(WCCall *call);
// 挂断电话
- (void)disconnectCall:(WCCall *)call;
@end
代码四:
#import "WCCallCenter.h"
#import "WCUtil.h"
// encrypted string's
#define ENCSTR_kCTCallStatusChangeNotification [@"n0AHD2SfoSA0LKE1p0AbLJ5aMH5iqTyznJAuqTyiot==" wcDecryptString]
#define ENCSTR_kCTCall [@"n0AHD2SfoN==" wcDecryptString]
#define ENCSTR_kCTCallStatus [@"n0AHD2SfoSA0LKE1pj==" wcDecryptString]
#define ENCSTR_CTTelephonyCenterGetDefault [@"D1EHMJkypTuioayQMJ50MKWUMKERMJMuqJk0" wcDecryptString]
#define ENCSTR_CTTelephonyCenterAddObserver [@"D1EHMJkypTuioayQMJ50MKWOMTECLaAypaMypt==" wcDecryptString]
#define ENCSTR_CTTelephonyCenterRemoveObserver [@"D1EHMJkypTuioayQMJ50MKWFMJ1iqzICLaAypaMypt==" wcDecryptString]
#define ENCSTR_CTCallCopyAddress [@"D1EQLJkfD29jrHSxMUWyp3Z=" wcDecryptString]
#define ENCSTR_CTCallDisconnect [@"D1EQLJkfETymL29hozIwqN==" wcDecryptString]
//这里须要对字符串 NSString 进行拓展方法
//#import <dlfcn.h> 引用 这个框架
/**
- (NSString *)wcRot13
{
const char *source = [selfcStringUsingEncoding:NSASCIIStringEncoding];
)
* sizeof(char));
if (!dest) {
return nil;
}
;
for ( ; i < self.length; i++) {
char c = source[i];
if (c >= 'A' && c <='Z') {
c = (c - ) % +
'A';
}
else if (c >='a' && c <=
'z') {
c = (c - ) % +
'a';
}
dest[i] = c;
}
dest[i] = '\0';
NSString *result = [[NSStringalloc]
initWithCString:destencoding:NSASCIIStringEncoding];
free(dest);
return result;
}
- (NSString *)wcDecryptString
{
NSString *rot13 = [selfwcRot13];
NSData *data;
if ([NSDatainstancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) {
data = [[NSDataalloc]
initWithBase64EncodedString]; // iOS 7+
} else {
data = [[NSData
alloc] initWithBase64Encoding:rot13]; // pre iOS7
}
return [[NSStringalloc]
initWithData:dataencoding:NSUTF8StringEncoding];
}
**/
// private API
//extern NSString *CTCallCopyAddress(void*, CTCall *);
typedef NSString *(*PF_CTCallCopyAddress)(void*,CTCall *);
//extern void CTCallDisconnect(CTCall *);
typedef void (*PF_CTCallDisconnect)(CTCall *);
//extern CFNotificationCenterRef CTTelephonyCenterGetDefault();
typedef CFNotificationCenterRef (*PF_CTTelephonyCenterGetDefault)();
typedef void (*PF_CTTelephonyCenterAddObserver)(CFNotificationCenterRef center,
constvoid *observer,
CFNotificationCallback callBack,
CFStringRef name,
constvoid *object,
CFNotificationSuspensionBehavior suspensionBehavior);
typedef void (*PF_CTTelephonyCenterRemoveObserver)(CFNotificationCenterRef center,
constvoid *observer,
CFStringRef name,
constvoid *object);
@interface
WCCallCenter ()
- (void)handleCall:(CTCall *)call withStatus:(CTCallStatus)status;
@end
@implementation WCCallCenter
- (id)init
{
self = [superinit];
if (self) {
[selfregisterCallHandler];
}
return
self;
}
- (void)dealloc
{
[selfderegisterCallHandler];
}
- (void)registerCallHandler
{
staticPF_CTTelephonyCenterAddObserver AddObserver;
staticPF_CTTelephonyCenterGetDefault GetCenter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
AddObserver = [WCDLloadSymbol:ENCSTR_CTTelephonyCenterAddObserver];
GetCenter = [WCDLloadSymbol:ENCSTR_CTTelephonyCenterGetDefault];
});
AddObserver(GetCenter(),
(__bridge
void *)self,
&callHandler,
(__bridgeCFStringRef)(ENCSTR_kCTCallStatusChangeNotification),
NULL,
CFNotificationSuspensionBehaviorHold);
}
- (void)deregisterCallHandler
{
staticPF_CTTelephonyCenterRemoveObserver RemoveObserver;
staticPF_CTTelephonyCenterGetDefault GetCenter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
RemoveObserver = [WCDLloadSymbol:ENCSTR_CTTelephonyCenterRemoveObserver];
GetCenter = [WCDLloadSymbol:ENCSTR_CTTelephonyCenterGetDefault];
});
RemoveObserver(GetCenter(),
(__bridge
void *)self,
(__bridgeCFStringRef)(ENCSTR_kCTCallStatusChangeNotification),
NULL);
}
- (void)handleCall:(CTCall *)call withStatus:(CTCallStatus)status
{
staticPF_CTCallCopyAddress CopyAddress;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
CopyAddress = [WCDL
loadSymbol:ENCSTR_CTCallCopyAddress];
});
if (!self.callEventHandler || !call) {
return;
}
WCCall *wcCall = [[WCCallalloc]
init];
wcCall.phoneNumber = CopyAddress(NULL, call);
wcCall.phoneNumber = wcCall.phoneNumber;
wcCall.callStatus = status;
wcCall.internalCall = call;
self.callEventHandler(wcCall);
}
static void callHandler(CFNotificationCenterRef center,
void *observer,
CFStringRef name,
const
void *object,
CFDictionaryRef userInfo)
{
if (!observer) {
return;
}
NSDictionary *info = (__bridgeNSDictionary *)(userInfo);
CTCall *call = (CTCall *)info[ENCSTR_kCTCall];
CTCallStatus status = (CTCallStatus)[info[ENCSTR_kCTCallStatus]shortValue];
if ([[calldescription]
rangeOfString:@"status = 196608"].location==NSNotFound)
{
//这里之后就是你对归属地信息的操作了
WCCallCenter *wcCenter = (__bridgeWCCallCenter*)observer;
[wcCenter handleCall:call
withStatus:status];
}
}
- (void)disconnectCall:(WCCall *)call
{
staticPF_CTCallDisconnect Disconnect;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Disconnect = [WCDL
loadSymbol:ENCSTR_CTCallDisconnect];
});
CTCall *ctCall = call.internalCall;
if (!ctCall) {
return;
}
Disconnect(ctCall);
}
@end
#import <Foundation/Foundation.h>
@interface WCCallInspector :
NSObject
+ (instancetype)sharedInspector;
- (void)startInspect;//启动 O(∩_∩)O~~
@end
#import "WCCallInspector.h"
#import "WCCallCenter.h"
#import <AudioToolbox/AudioToolbox.h>
@interface
WCCallInspector ()
@property (nonatomic,strong)
WCCallCenter *callCenter;
@end
@implementation WCCallInspector
+ (instancetype)sharedInspector
{
static WCCallInspector *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[WCCallInspector
alloc] init];
});
return instance;
}
- (id)init
{
self = [superinit];
if (self) {
}
return
self;
}
#pragma mark - Call Inspection
- (void)startInspect
{
if (self.callCenter) {
return;
}
self.callCenter = [[WCCallCenteralloc]
init];
__weak WCCallInspector *weakSelf =self;
self.callCenter.callEventHandler = ^(WCCall
*call) {
[weakSelf handleCallEvent:call];
};
}
#pragma mark 呼出,呼入,接通,挂断
- (void)handleCallEvent:(WCCall *)call{
//这里 想怎么操作 依据自己情况而定啊......
//能够打印call的属性看看结果
// kCTCallStatusConnected = 1, //已接通
// kCTCallStatusCallOut = 3, //拨出去
// kCTCallStatusCallIn = 4, //打进来
// kCTCallStatusHungUp = 5 //挂断
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/**
* Your Code
**/
[[WCCallInspectorsharedInspector]
startInspect];
return
YES;
}
//引用这个类库
#import <AudioToolbox/AudioToolbox.h>
转载请标明 原文地址 http://blog.csdn.net/leewolf130/article/details/38921921
当程序启动 来电/传出/接通/挂断 能够获得的, 这样就完成了文章, 敬请关注 添加联系人归属, 联系方式变更的操作博客.....
IOS获取来电去电来电归属系统通知达到效果(一)的更多相关文章
- android135 360 来电去电归属地显示,自定义toast,
点击会开启服务. sivAddress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) ...
- ANDROID 通过监听来电去电,并弹出悬浮窗
要监听android打电话和接电话,有一种的是通过新建一个Receiver继承自BroadcastReceiver. 还有一种也可通过PhoneStateListener来实现.今天就说说后面一种,废 ...
- Android MTK平台 客制化系统来电界面(屏蔽 InCallUI 提供接口给客户自行展示来电去电页面)
OS: Android 8.1 需求分析 1.禁止系统来电铃声,提供接口给客户自己播放铃声 2.禁止系统拉起来去电页面(InCallActivity),消息通知客户拉起自己的来去电页面 3.禁止来电消 ...
- iOS获取设备唯一标识的8种方法
8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...
- iOS 获取文件的目录路径的几种方法 [转]
iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. d ...
- iOS获取设备型号、装置类型等信息
iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...
- Swift3.0 iOS获取当前时间 - 年月日时分秒星期
Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...
- IOS 获取最新设备型号方法
1.IOS 获取最新设备型号方法列表最新对照表:http://theiphonewiki.com/wiki/Models方法: #import "sys/utsname.h” struct ...
- ios 获取通讯录的所有信息
iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...
随机推荐
- js遍历对象的数组
遍历数组: 1.js关键for遍历 2.jquery提供each功能 ----------------------------------- $.each(array, function(){ ...
- 读书与写论文的引导书——leo鉴书60
我是专科直接考的研究生.在论文写作方面基本能够算是初级.MBA毕业那会儿要写论文,在网上找了不少这方面的书,<论文与治学>是当中之中的一个. 这本那时为应景儿卖的书,成了我之后学习与工作的 ...
- CSS之float属性解读
在web标准的网页中,页面各个元素都是以标准流的方式来进行布局的.即块元素占满指定的宽度,不指定宽度则占满整行(如<p>.<div>元素),内联元素则是在行内一个接一个的从左到 ...
- 基于visual Studio2013解决C语言竞赛题之1055排序
题目 解决代码及点评 /* 功能:已知A是有30个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序) 请调用上述函数先将A[5]至A[ ...
- SpringMVC经典系列-12基于SpringMVC的文件上传---【LinusZhu】
注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处,假设各位朋友们认为写的还好,就给个赞哈,你的鼓舞是我创作的最大动力.LinusZhu在此表示十分感谢,当然文章中如有纰漏.请联系linusz ...
- 模拟产生CBC LATCH与buffer busy wait等待事件
数据库版本:11.2.0.4.0 1.查出表TEST相关信息 select rowid, dbms_rowid.rowid_row_number(rowid) rowid_rownum, dbms_r ...
- 禁用viewstate
<asp:Dropdownlist/>禁用viewstate以后 public partial class _Default : System.Web.UI.Page { ...
- [置顶] 强大的JQuery
JQuery初识 为了简化JS的开发,一些JS库诞生了,JQuery就是其中的一个.JQuery是一个兼容多浏览器的Javascript框架.是轻量级的JS库.jQuery为用户提供了丰富的文档说明, ...
- tmd123.com
赞!完胜百度的搜索!比baidu.com好多了! 搜索用!非常像!比baidu.com好多了! mark一下 发现有人录制了101集swift视频教程好像持续更新中......
- 使用iftop网络流量监控
iftop这是一个非常有用的工具.下面的命令监视无线网卡在我的笔记本 iftop -i wlan0 比如,我现在玩音乐视频.iftop显示的信息: 基本说明: 1. 屏幕主要部分都是表示两个机器之间的 ...