这里的原理是获得到呼叫系统通知,然后根据本地呼叫电话号码,相应的电话联系.

一世。   来电显示是不是在地址簿中的联系人, 这是当第一个加入一个临时的联系人在您的电话簿(它是创建一个新的接触,并保存相应的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 //挂断

}


//startInspect//这种方法须要在程序启动时候注冊

- (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获取来电去电来电归属系统通知达到效果(一)的更多相关文章

  1. android135 360 来电去电归属地显示,自定义toast,

    点击会开启服务. sivAddress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) ...

  2. ANDROID 通过监听来电去电,并弹出悬浮窗

    要监听android打电话和接电话,有一种的是通过新建一个Receiver继承自BroadcastReceiver. 还有一种也可通过PhoneStateListener来实现.今天就说说后面一种,废 ...

  3. Android MTK平台 客制化系统来电界面(屏蔽 InCallUI 提供接口给客户自行展示来电去电页面)

    OS: Android 8.1 需求分析 1.禁止系统来电铃声,提供接口给客户自己播放铃声 2.禁止系统拉起来去电页面(InCallActivity),消息通知客户拉起自己的来去电页面 3.禁止来电消 ...

  4. iOS获取设备唯一标识的8种方法

    8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...

  5. iOS 获取文件的目录路径的几种方法 [转]

    iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. d ...

  6. iOS获取设备型号、装置类型等信息

    iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...

  7. Swift3.0 iOS获取当前时间 - 年月日时分秒星期

    Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...

  8. IOS 获取最新设备型号方法

    1.IOS 获取最新设备型号方法列表最新对照表:http://theiphonewiki.com/wiki/Models方法: #import "sys/utsname.h” struct ...

  9. ios 获取通讯录的所有信息

    iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...

随机推荐

  1. crm查询记录共享给了哪些人

    有时候,我们须要查询一个记录.共享给了哪些人?怎么做? 第一种做法:是sql的方式 select * from PrincipalObjectAccess where objectid = '5226 ...

  2. Cocos2d-x教程第(11)讲-利用遮罩(蒙版)CCLayerColor制作新手引导界面(上)

    欢迎转载,转载时请注明原文出处:http://blog.csdn.net/u012945598/article/details/17280019 源码下载地址:http://download.csdn ...

  3. 编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功)

    编译mapnik(win7 环境下vs2008编译mapnik 0.7.1 成功) ------by  wangsh 2012.02.22 Mapnik 是一个开源的 Python/C++ 地图渲染引 ...

  4. eclipse升级后Android使用JAR报错

    升级ADT22以后,老项目编译时后遇到 NoDefFoundClassError  这个错误,因为项目中使用了jar文件. 遇到此问题的解决步骤: 1.项目根目录下建立 libs ,并将jar文件移入 ...

  5. FORM验证简单demo

    详解稍后加入. 项目结构如图: web.xml <?xml version="1.0" encoding="UTF-8" ?> <web-ap ...

  6. ASP.NET - 禁用ViewState

    默认情况下,ViewState是被启用的,比如提交表单后,表单中输入的值会自动保留.但是如果不需要保留,也可以将其禁用,这样可以节省资源.   下面3种方式就可以分别禁用某一个控件.某一个页面和整个应 ...

  7. shell telnet 路由器

    #!/usr/bin/expect -f spawn telnet 172.16.1.80 expect "login" { send "admin\n" ex ...

  8. Hive HA使用说明

    hive让大数据飞了起来,不再需要专人写MR.平常我们都可以用基于thrift的任意语言来调用hive. 不过爱恨各半,hive的thrift不稳定也是出了名的.很容易就出问题,让人无计可施.唯一的办 ...

  9. 不用splitter控件 简单实现对mfc对话框的分割的方法

    不用splitter控件  简单实现对mfc对话框的分割的方法 直接贴上源代码主要部分吧 这个是基于对话框的工程 进行对话框的分割实现 只是相应了三个消息函数,看一下就会明白的 我空间资源里边有现成的 ...

  10. 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

    眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...