iOS来电号码识别

Demo

一、创建一个新的target

屏幕快照 2018-05-04 上午11.13.21.png

选择Call Directory Extension


屏幕快照 2018-05-04 上午11.16.26.png

选中主程序YSCallDemo这个target,找到App Group打开
勾选一个开发者team


1.jpg

选中用于号码识别的target同样找到App Group打开
勾选一个开发者team
75E093D0839AA5089656BA7C29B218CA.jpg

两个target都选中后会多了一个YSCallDemo.entitlements


屏幕快照 2018-05-08 下午11.24.06.png

有时候会出现文件找不到的情况,可以在target-->build phases里手动添加编译文件

image.png

二、准备号码库,更新号码识别库就可以号码识别了

//这里是采用realm数据库来存储号码,路径选择共享路径即可
- (void)realmConfiguation {
    
            NSURL *url = [[[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.yasha.group"] URLByAppendingPathComponent:@"IDCall"] URLByAppendingPathExtension:@"realm"];
            [[NSFileManager defaultManager] removeItemAtURL:url error:nil];
    // APP Group 宿主程序数据库共享
    RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration];
    configuration.fileURL = [[[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.yasha.group"] URLByAppendingPathComponent:@"IDCall"] URLByAppendingPathExtension:@"realm"];
    [RLMRealmConfiguration setDefaultConfiguration:configuration];
    NSLog(@"数据库地址:%@", [RLMRealmConfiguration defaultConfiguration].fileURL);
    // 数据迁移
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    
    
}

更新号码识别库

//调用这个方法就可以将数据写入到号码识别库
CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
   
    [manager reloadExtensionWithIdentifier:@"yasuo.YSCallDemo.CallExtension" completionHandler:^(NSError * _Nullable error) {
}

调用更新后程序自动执行CallDirectoryHandler.m的方法

- (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context {
    context.delegate = self;
    [self addOrRemoveIncrementalIdentificationPhoneNumbersToContext:context];
//这里直接调用号码增加和移除的方法
    
    [context completeRequestWithCompletionHandler:nil];
}

调用这个方法数据写入

(void)addOrRemoveIncrementalIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context {
    
    //配置数据库
    RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration];
    configuration.fileURL = [[[[NSFileManager defaultManager]
                               containerURLForSecurityApplicationGroupIdentifier:@"group.com.yasha.group"] URLByAppendingPathComponent:@"IDCall"] URLByAppendingPathExtension:@"realm"];
    [RLMRealmConfiguration setDefaultConfiguration:configuration];
    RLMRealm *realm = [RLMRealm defaultRealm];
    
   
    
    [realm beginWriteTransaction];
    RLMResults *results = [[YSContactModel allObjects] sortedResultsUsingKeyPath:@"phone" ascending:YES];
    [realm commitWriteTransaction];
    if (results.count != 0) {
        [context removeAllIdentificationEntries];
        
        NSMutableArray *allPhoneNumbersArray = [NSMutableArray array];
        NSMutableArray *labelsArray = [NSMutableArray array];
        for (YSContactModel *model in results) {
            [allPhoneNumbersArray addObject:[NSString stringWithFormat:@"%zd",model.phone ]];
            [labelsArray addObject:model.name];
        }
        
        for (NSUInteger i = 0; i < allPhoneNumbersArray.count; i ++) {
            CXCallDirectoryPhoneNumber phoneNumber = [allPhoneNumbersArray[i] longLongValue];
            NSString *label = labelsArray[I];
            [context addIdentificationEntryWithNextSequentialPhoneNumber:phoneNumber label:label];
        }
    }
}

这里就可以实现号码识别了

三、常见错误

号码存入时需要加国家区号,要升序排列
比如com.apple.CallKit.error.calldirectorymanager Code=4 表示数据重复
授权没打开也会报,Domain=com.apple.CallKit.error.calldirectorymanager Code=6
官方
网上找的swift版本的报错枚举

public enum Code : Int {
        public typealias _ErrorType = CXErrorCodeCallDirectoryManagerError

        case unknown

        case noExtensionFound

        case loadingInterrupted

        case entriesOutOfOrder

        case duplicateEntries

        case maximumEntriesExceeded

        case extensionDisabled

        @available(iOS 10.3, *)
        case currentlyLoading

        @available(iOS 11.0, *)
        case unexpectedIncrementalRemoval
    }

三、通过cocoapod进来的第三方和让共享target可以使用的方法

第一步:
PROJECT --info --configurations,将对应的Debug和Release 设置成pods-你的Xcode项目名.debug和pods-你的Xcode项目名.release。
这些是在下图中可以选择的,不需要手动填写。!


29BCA5E97E3FD86DE1CC6C8AFC10D768.jpg

31A227EF2AD6879836E434A72CC3F038.jpg

第二步:

TARGETS--Build Phases --Link Binary With Libraries,将pods的.a文件引入
5F086B23F797949F2A32704197BBA7C4.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容