統(tǒng)計 iOS 設(shè)備鎖定、解鎖次數(shù)

今天下了個軟件,可以記錄手機解鎖的次數(shù)和使用時間,當然啦,App 必須在后臺運行著。當時比較納悶的是有什么 API 可以接收設(shè)備解鎖事件或通知的,Google 了下,還真有哎——我是鏈接。

設(shè)備鎖定的狀態(tài)

由上面的回答可以知道,設(shè)備在鎖定、解鎖的時候,SpringBoard 都會發(fā)出通知,iPhoneDevWiki 這里能找到更多有趣的通知(注意:黃色標注的通知是有狀態(tài)變量與之關(guān)聯(lián)的,后面會用到)。貼訂閱通知的代碼:

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), // 獲取通知中心
                                NULL,  // 設(shè)置觀察者
                                deviceLockStatusChanged,  // 接收到通知時的回調(diào)函數(shù)
                                CFSTR("com.apple.springboard.lockstate"),  // 通知名
                                NULL,  // 要觀察的對象
                                CFNotificationSuspensionBehaviorDeliverImmediately  // 決定應用在后臺如何處理通知的標記
                                );

這里所用的通知中心并不是我們常用的 [NSNotificationCenter defalutCenter],而是 CFNotificationCenterRef 對象。提一下,即便前者的底層確實是由 CFNotificationCenter 實現(xiàn)的,但它們兩者不是 Toll-Free Bridged?;氐?CFNotificationCenterRef,有下面三個函數(shù)獲得不同的通知中心:

  1. CFNotificationCenterGetLocalCenter(void);
  2. CFNotificationCenterGetDistributedCenter(void);
  3. CFNotificationCenterGetDarwinNotifyCenter(void);

第一個是我們熟悉的 Local Center,可以理解為通知的行為完全由本進程維護,作用域也僅在本進程;
第二個是 Distributed Center,如果有看到這個函數(shù)聲明上的編譯條件,你就會發(fā)現(xiàn)僅在桌面系統(tǒng)上才有 Distributed Center 可用。它可以實現(xiàn)兩個進程之間的通信,感興趣可以看看 Communicating With the Target Application ,似乎是通過 BundleID 實現(xiàn)對特定應用發(fā)送通知;
第三個是本文的重點,Darwin Center 的服務(wù)由系統(tǒng)的一個守護進程維護,相比 Local Center,通知的作用域擴大到了所有進程。這就為什么我們的應用能夠接收到 SpringBoard.app 發(fā)送的通知。本文用的是用 CoreFoundation 的函數(shù)實現(xiàn)接收通知,除此之外,文檔里還提到了利用 Mach Port, File Descriptors, Signal 等方法。查看 Darwin Notification Concepts 了解更多。

接下來要講講回調(diào)函數(shù)了:

static void deviceLockStatusChanged(CFNotificationCenterRef center,
                                void *observer,
                                CFStringRef name,
                                const void *object,
                                CFDictionaryRef userInfo){
NSString *nameString = (__bridge NSString*)name;
int token;
uint64_t state;
notify_register_check(nameString.UTF8String, &token);
notify_get_state(token, &state);
NSLog(@"%@: token: %d, state: %llu", nameString, token, state);
if (state == 0) {
    counter++;
}
notify_cancel(token);

}

函數(shù)的原型是直接抄文檔的,notify_register_check() 可以生成一個 token 值用來關(guān)聯(lián)某一個通知,接著用 notify_get_state() 就可以獲得響應狀態(tài)值。最后是 notify_cancel(),它用來取消跟 token 相關(guān)聯(lián)的通知和釋放相應的資源,按 manual pages 的描述好像只針對利用 Mach Port 和 File Descriptors 接收消息時創(chuàng)建的資源。具體到這個回調(diào)函數(shù),不太清楚底層做了什么,但我們能看到的是 token 被清零了。

后臺運行

獲得設(shè)備鎖定、解鎖的方法有了,接著是要讓應用保存生命力,不能讓它被掛起,否則就統(tǒng)計不了次數(shù)了。比較常見的方法就是循環(huán)播放一段空白的聲音,然后在 Info.plist 里面添加相應的字段(KEY: UIBackgroundModes, VALUE: audio),或者直接在 Capabilities 里面的 Background Modes 中 Audio 的復選框中打個勾。

??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

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

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,195評論 30 471
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,665評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 1、OC中創(chuàng)建線程的方法是什么?如果指定在主線程中執(zhí)行代碼?如何延時執(zhí)行代碼?!倦y度系數(shù)★★】 1)創(chuàng)建線程的方法...
    木旁_G閱讀 1,981評論 2 16
  • 紐約比加州快3小時, 但并不意味加州慢了。 有些人22歲畢業(yè), 但熬了5年才獲得一份好工作。 有些人25歲就當上C...
    暴有料閱讀 643評論 0 1