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 ...
随机推荐
- Determine whether an integer is a palindrome. Do this without extra space.
看到这个题目的时候,首先不认识 Determine这个单词.英文不好没办法,查了下是确认的意思,然后不懂 palindrome这个单词, 查了下是回文的意思. 问题是 回文是个什么东西,官方解释: A ...
- 重操JS旧业第十一弹:BOM对象
BOM对象即浏览器内置对象,现今流行的浏览器内核有Safri,Firefox,Chrome,Opera,IE其中IE的兼容性是最蛋疼的在10及其过后还好点,但是现在IE基本上淘汰,而国内像360这种垃 ...
- Linux/ubuntu下的boost库安装
我一直都没有写博客的习惯,最近正好在研究linux下的开发(目前也只是粗粗的研究),且用到了boost库,就乘此机会写点什么,最起码记录一下我在安装boost的一些步骤,主要给和我一样的linux开发 ...
- checkbox之checked的方法(attr和prop)区别
1. $('#checkbox').click(function(){ if($('#checkbox').is(':checked')) { $(".sendmailhui"). ...
- Flex上传文件
前几天写了一篇jsp页面利用ajaxFileUpload上传文件.如今把flex上传页面也分享出来: 前台页面 <?xml version="1.0" encoding=&q ...
- shell脚本中怎样同时执行多个.sql文件,并把结果写入文件中(转)
转载:http://joewalker.iteye.com/blog/408879命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名;导出整个数据 ...
- Mfc资源消息的响应机制
Mfc消息的响应机制 Mfc中有很多资源,如图标资源,菜单资源,工具栏资源等等:那么,资源是如何进行消息响应和消息映射的呢? 它们的流程是: 某种资源——对应的ID号——消息映射——响应函数的声明与实 ...
- Mono for Android 初学遇到的问题
1.搭建开发环境: 在win7系统中,VS2012 可以用 C# 开发Android 应用程序,mono for andriod 破解成功. 在win server 2008 系统中 破解不成功,具体 ...
- Android开发之下载Tomcat服务器的文件到模拟器的SD卡
Tomcat服务器可以到Apache的官网去下载http://tomcat.apache.org/,如何配置和使用百度下也有很多介绍,只要把Java的SDK配下java_home环境变量就行了,因为T ...
- [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)
---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...