IOS获取来电去电来电归属系统通知达到效果(一)

2023-10-19 08:30

本文主要是介绍IOS获取来电去电来电归属系统通知达到效果(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

一世。   来电显示是不是在地址簿中的联系人, 这是当第一个加入一个临时的联系人在您的电话簿(它是创建一个新的接触,并保存相应的RecordID)

情况二  已在通讯录的联系人

然后 把相应本次通话的电话标签改动成归属地字符



原文地址    http://blog.csdn.net/leewolf130/article/details/38921921


好了 ,先看看怎么获取系统电话通知

须要的类



//创建电话对象

代码一: 

#import <Foundation/Foundation.h>

@import CoreTelephony;


// private API

typedef NS_ENUM(short, CTCallStatus) {

    kCTCallStatusConnected = 1, //已接通

    kCTCallStatusCallOut = 3, //拨出去

    kCTCallStatusCallIn = 4, //打进来

    kCTCallStatusHungUp = 5 //挂断

};


@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];

    char *dest = (char *)malloc((self.length +1) * sizeof(char));

    if (!dest) {

        return nil;

    }

    

    NSUInteger i = 0;

    for ( ; i < self.length; i++) {

        char c = source[i];

        if (c >= 'A' && c <='Z') {

            c = (c - 'A' + 13) % 26 + 'A';

        }

        else if (c >='a' && c <= 'z') {

            c = (c - 'a' + 13) % 26 + '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:rot13options:0]; // 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获取来电去电来电归属系统通知达到效果(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/238598

相关文章

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹