利用CallKit 實(shí)現(xiàn)來電識別 遇到的一些坑

最近項(xiàng)目中新增了一個需求,需要使用 iOS 10 中新增的 CallKit 來實(shí)現(xiàn)一個來電識別的功能验毡。按照慣例,先在網(wǎng)上搜索了一下帝嗡,看了幾篇文章晶通,覺得實(shí)現(xiàn)起來很簡單嘛。于是就愉快的開始了哟玷,然后就開始遇見一個個坑狮辽,網(wǎng)上目前存在的文章都是簡單的實(shí)現(xiàn)了號碼識別,但是關(guān)于號碼規(guī)則巢寡、大數(shù)量的數(shù)據(jù)如何處理等都沒有提及喉脖。這篇文字就記錄下我個人在實(shí)現(xiàn)這個功能時遇到的坑以及如何解決的。

一抑月,具體實(shí)現(xiàn)

如何實(shí)現(xiàn)就不在詳細(xì)描寫了树叽,網(wǎng)上已經(jīng)有很多的文章寫了。

二谦絮,具體功能實(shí)現(xiàn)遇到的各種坑

號碼規(guī)則
  1. 號碼必須進(jìn)行排列题诵,添加順序?yàn)閮?yōu)先添加小的號碼洁仗。譬如:123和132兩個號碼要先添加123,然后添加132.
  2. 號碼的格式化性锭,手機(jī)號碼前面需要添加國家碼赠潦,固話需要帶有區(qū)號,然后區(qū)號去零草冈,然后前面添加國家碼她奥。譬如手機(jī)號:185XXXXX8497 需要格式化為86185XXXXX8497;固話 0755-12345678 需要格式化為:8675512345678.
  3. 號碼去重怎棱,一個手機(jī)號碼只能添加一次哩俭,添加多次會開啟失敗。
    PS:大文件的號碼排序蹄殃、去重可以看看我的另一篇文章:大文件內(nèi)容使用shell 排序携茂、去重
大數(shù)量的數(shù)據(jù)如何添加

大數(shù)據(jù)不能一下讀取到內(nèi)存中,否則會導(dǎo)致打開失敗诅岩。我們給的號碼庫有三十幾M讳苦,大概100萬數(shù)據(jù),剛開始直接讀入內(nèi)存中吩谦,一直打開失敗鸳谜。解決辦法:從文件中一行行讀取數(shù)據(jù),使用后釋放式廷。我的號碼庫文件咐扭,大概這樣的形式:

[
{"86196852102": "騷擾電話"},
{"86196852201": "詐騙電話"},
{"86196852202": "騷擾電話"},
{"86196852213": "詐騙電話"},
{"86201008613": "廣告推銷"},
{"86202096585": "詐騙電話"},
{"86211008611": "廣告推銷"},
{"86216618834": "廣告推銷"},
{"86219506524": "騷擾電話"},
]

具體代碼如下:

 NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupIdentifierExtension];
   //文件路徑
   containerURL = [containerURL URLByAppendingPathComponent:LocalstorageName];
   NSString* fileRoot = containerURL.path;
   FILE *file = fopen([fileRoot UTF8String], "r");
   char buffer[1024];
   while (fgets(buffer, 1024, file) != NULL){
       @autoreleasepool {
           NSString* result = [NSString stringWithUTF8String:buffer];
           result = [result stringByReplacingOccurrencesOfString:@"," withString:@""];
           NSData *jsonData = [result dataUsingEncoding:NSUTF8StringEncoding];
           NSError *err;
           NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                               options:NSJSONReadingAllowFragments
                                                                 error:&err];
           if(err)
           {
           }else
           {
               NSString *number = dic.allKeys[0];
               NSString *name = dic[number];
               
               if (number == nil || name == nil)
               {
               }else {
//                    number = [self fixPhone:number];
                   CXCallDirectoryPhoneNumber phoneNumber = [number longLongValue];
                   [context addIdentificationEntryWithNextSequentialPhoneNumber:phoneNumber label:name];
               }

           }
           dic = nil;
       }
       
   }

實(shí)際測試,將近100萬的數(shù)據(jù)在 6S Plus 15S內(nèi)可以完成加載滑废。

號碼庫更新后如何通知系統(tǒng)更新數(shù)據(jù)

號碼庫可以通過下載進(jìn)行更新蝗肪,一般下載的是壓縮包,解壓縮后蠕趁,把數(shù)據(jù)寫進(jìn)共享文件內(nèi)薛闪,更新數(shù)據(jù)后,需要通知系統(tǒng)去刷新數(shù)據(jù)庫俺陋,是數(shù)據(jù)生效豁延。具體解壓縮可以搜索: SSZipArchive ,擴(kuò)展和主APP數(shù)據(jù)擴(kuò)展可以看這篇文章:WWDC2014之App Extensions學(xué)習(xí)筆記 通知系統(tǒng)刷新號碼數(shù)據(jù)庫的具體代碼:

//IdentifierExtension 為擴(kuò)展的 Bundle Identifier
 CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
  [manager reloadExtensionWithIdentifier:IdentifierExtension completionHandler:^(NSError * _Nullable error) {
  }];
要使用真機(jī)調(diào)試

不要使用模擬器,用模擬器調(diào)試時的錯誤不要管腊状。血的教訓(xùn)诱咏,查看用戶擴(kuò)展的使用權(quán)限和更新數(shù)據(jù)時使用模擬器一直報(bào)錯,找了半天的錯誤缴挖,換了真機(jī)就沒有問題袋狞,也是我自己2了 [二哈] 。

數(shù)據(jù)可以分開寫

這句話的意思是先寫入少量的數(shù)據(jù),讓用戶打開權(quán)限時硕并,感覺不到延時法焰,當(dāng)權(quán)限打開后,在寫入大量的數(shù)據(jù)倔毙,刷新數(shù)據(jù)源埃仪,用戶感覺不到等待的時間。

因?yàn)橹罢f了寫入幾十萬的 數(shù)據(jù)需要大概十幾秒的時間陕赃,在我的思維里面覺得是很正常的卵蛉,但是在產(chǎn)品眼里這是不可接受的。巴拉巴拉說了一堆么库,說騰訊啊傻丝、360啊人家都打開的很快的。你娘八呷濉F乡帧!好吧算你贏忱反。
最后想到一個辦法泛释,先寫入很少量的數(shù)據(jù),然后在寫入大量的數(shù)據(jù)温算。這樣就完美的解決了第一次加載時間慢的問題怜校。
具體的來說就是,第一次請求用戶打開權(quán)限的時間注竿,先寫入很少量的數(shù)據(jù)茄茁,當(dāng)判斷用戶已經(jīng)打開了權(quán)限,就寫入大量的數(shù)據(jù)巩割,然后刷新下數(shù)據(jù)源裙顽,這樣就是在用戶完全沒有感知的情況下刷新了數(shù)據(jù)源。

最好提供一個演示視頻

審核的蘋果爸爸使用的 iPad 測試宣谈,然后把我們拒了愈犹,說不知道如何使用 CallKit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒲祈,一起剝皮案震驚了整個濱河市甘萧,隨后出現(xiàn)的幾起案子萝嘁,更是在濱河造成了極大的恐慌梆掸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牙言,死亡現(xiàn)場離奇詭異酸钦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咱枉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門卑硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徒恋,“玉大人,你說我怎么就攤上這事欢伏∪胝酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵硝拧,是天一觀的道長径筏。 經(jīng)常有香客問我,道長障陶,這世上最難降的妖魔是什么滋恬? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮抱究,結(jié)果婚禮上恢氯,老公的妹妹穿的比我還像新娘。我一直安慰自己鼓寺,他們只是感情好勋拟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侄刽,像睡著了一般指黎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上州丹,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天醋安,我揣著相機(jī)與錄音,去河邊找鬼墓毒。 笑死吓揪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的所计。 我是一名探鬼主播柠辞,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼主胧!你這毒婦竟也來了叭首?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤踪栋,失蹤者是張志新(化名)和其女友劉穎焙格,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夷都,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眷唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬阳。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛤虐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肝陪,到底是詐尸還是另有隱情驳庭,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布氯窍,位于F島的核電站嚷掠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荞驴。R本人自食惡果不足惜不皆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熊楼。 院中可真熱鬧霹娄,春花似錦、人聲如沸鲫骗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽执泰。三九已至枕磁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术吝,已是汗流浹背计济。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留排苍,地道東北人沦寂。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像淘衙,于是被迫代替她去往敵國和親传藏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理彤守,服務(wù)發(fā)現(xiàn)毯侦,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫具垫、插件侈离、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 小孩教育,你舍得嚴(yán)厲嗎做修?董事長杜總分享了他自己看法霍狰。 我女兒今年考上大學(xué),過年時饰及,我把她拉過來好好談了一次話蔗坯。 “...
    河馬先森閱讀 234評論 2 0
  • 在編輯標(biāo)題前宾濒,其實(shí)早就想好了一個標(biāo)題:被出版社的編輯找到約插畫是什么感覺?倒也不是因?yàn)檫@個標(biāo)題會吸引多些眼球屏箍,實(shí)在...
    夏暖心閱讀 513評論 9 8