iOS 注冊進(jìn)程之間的通知

最近開發(fā)中為了方便自己測試责循,準(zhǔn)備弄個簡單業(yè)務(wù)錯誤日志統(tǒng)計。由于只是測試用,況且出現(xiàn)我認(rèn)為可能錯的情況幾率很小。想在不改變現(xiàn)有代碼的情況下殷绍,直接獲取NSLog內(nèi)容。查了些資料鹊漠,知道NSLog輸出的內(nèi)容會寫到控制臺和系統(tǒng)日志(ASL)里面主到。我就想在輸入到ASL的時候把特定的數(shù)據(jù)給保存下來。但是我無法知道NSLog什么時候輸出內(nèi)容躯概,看到網(wǎng)上開源的DDLogger的源碼登钥,找到了解決的方法。原來只是需要注冊下系統(tǒng)的通知就可以拿到輸出的時機(jī)娶靡,然后通過<asl.h>提供的方法去操作系統(tǒng)設(shè)備log牧牢。

notify.h

這個頭文件里面提供了用于進(jìn)程之間的無狀態(tài)通知方法。用法和我們通知使用差不多姿锭。

//通知的注冊
int token;
notify_register_dispatch("com.apple.system.logger.message", &token, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(int token) {
        NSLog(@"receive nofity");
    });

//發(fā)送通知塔鳍。
notify_post("com.apple.system.logger.message");

//通知取消
notify_cancel(token);

從用法上,可以看出發(fā)通知只能用通知的名字呻此,而且不能傳遞參數(shù)轮纫。由于這個是通過操作系統(tǒng)發(fā)出的,換句話說焚鲜,只要不同的進(jìn)程注冊了同一個通知名掌唾,當(dāng)發(fā)送notify_post的時候,所有的進(jìn)程都會收到忿磅。自己做了個測試糯彬,開啟兩個app,隨便弄個自己的通知葱她,然后其中一個app進(jìn)行注冊情连,另一個app進(jìn)行發(fā)送,的確能收到通知览效。

我們也可以通過CFNotificationCenter提供的方法去注冊這些通知却舀,它的實現(xiàn)也是基于<notify.h>里面的API。

狀態(tài)的設(shè)置

當(dāng)我們第一次注冊某個通知時候锤灿,可能并不知道當(dāng)前資源是否可以使用挽拔,必須等待下一次的通知回調(diào)。系統(tǒng)也提供了一個解決方法但校,如果是發(fā)送方螃诅,在資源可以使用的時候做一個標(biāo)記位,接受方状囱,在注冊之前可以先檢查下术裸,當(dāng)前資源是否可以使用,如果可以使用亭枷,可以直接進(jìn)入自己的邏輯處理袭艺。


//發(fā)送方
int token;
notify_register_check("customMessage", &token);
    
uint64_t state = 1;
    
notify_set_state(token, state);

//接受方

int token;
notify_register_check("customMessage", &token);
    
uint64_t state;
    
notify_get_state(token, &state);
    
if (state) {
    //logic
}
//注冊通知
notify_register_dispatch("com.apple.system.logger.message", &token, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(int token) {
        NSLog(@"receive nofity");
    });

notify_keys.h

系統(tǒng)提供了一些我們可以注冊的通知:


/*
 * Directory Service notifications
 * These are posted by the DirectoryService daemon to advise clients that
 * cached data should be invalidated.
 */
#define kNotifyDSCacheInvalidation "com.apple.system.DirectoryService.InvalidateCache"
#define kNotifyDSCacheInvalidationGroup "com.apple.system.DirectoryService.InvalidateCache.group"
#define kNotifyDSCacheInvalidationHost "com.apple.system.DirectoryService.InvalidateCache.host"
#define kNotifyDSCacheInvalidationService "com.apple.system.DirectoryService.InvalidateCache.service"
#define kNotifyDSCacheInvalidationUser "com.apple.system.DirectoryService.InvalidateCache.user"

/*
 * File System notifications
 * These advise clients of various filesystem events.
 */
#define kNotifyVFSMount "com.apple.system.kernel.mount"
#define kNotifyVFSUnmount "com.apple.system.kernel.unmount"
#define kNotifyVFSUpdate "com.apple.system.kernel.mountupdate"
#define kNotifyVFSLowDiskSpace "com.apple.system.lowdiskspace"
#define kNotifyVFSLowDiskSpaceRootFS "com.apple.system.lowdiskspace.system"
#define kNotifyVFSLowDiskSpaceOtherFS "com.apple.system.lowdiskspace.user"

/*
 * System Configuration notifications
 * These advise clients of changes in the system configuration
 * managed by the system configuration server (configd).
 * Note that a much richer set of notifications are available to
 * clients using the SCDynamicStore API.
 */
#define kNotifySCHostNameChange "com.apple.system.hostname"
#define kNotifySCNetworkChange "com.apple.system.config.network_change"

/*
 * ASL notifications
 * Sent by syslogd to advise clients that new log messages have been
 * added to the ASL database.
 */
#define kNotifyASLDBUpdate "com.apple.system.logger.message"

/*
 * Time Zone change notification
 * Sent by notifyd when the system's timezone changes.
 */
#define kNotifyTimeZoneChange "com.apple.system.timezone"

/*
 * System clock change notification
 * Sent when a process modifies the system clock using the settimeofday system call.
 */
#define kNotifyClockSet "com.apple.system.clock_set"

個人覺得里面kNotifyVFSLowDiskSpace,這個可以用來給app增加一個當(dāng)手機(jī)存儲空間很少的時候自動清理緩存的功能叨粘。對于網(wǎng)絡(luò)切換猾编,我們又多了一個監(jiān)聽方法。除了這些系統(tǒng)開放出來的升敲,網(wǎng)上還有不少私有的通知答倡,比如屏幕的亮度調(diào)節(jié),鎖屏的監(jiān)聽等等驴党。有興趣的可以看看其他的通知瘪撇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市港庄,隨后出現(xiàn)的幾起案子倔既,更是在濱河造成了極大的恐慌,老刑警劉巖攘轩,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叉存,死亡現(xiàn)場離奇詭異,居然都是意外死亡度帮,警方通過查閱死者的電腦和手機(jī)歼捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笨篷,“玉大人瞳秽,你說我怎么就攤上這事÷食幔” “怎么了练俐?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冕臭。 經(jīng)常有香客問我腺晾,道長燕锥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任悯蝉,我火速辦了婚禮归形,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鼻由。我一直安慰自己暇榴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布蕉世。 她就那樣靜靜地躺著蔼紧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狠轻。 梳的紋絲不亂的頭發(fā)上奸例,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音哈误,去河邊找鬼哩至。 笑死,一個胖子當(dāng)著我的面吹牛蜜自,可吹牛的內(nèi)容都是我干的菩貌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼重荠,長吁一口氣:“原來是場噩夢啊……” “哼箭阶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戈鲁,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤仇参,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后婆殿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诈乒,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年婆芦,在試婚紗的時候發(fā)現(xiàn)自己被綠了怕磨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡消约,死狀恐怖肠鲫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情或粮,我是刑警寧澤导饲,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響渣锦,放射性物質(zhì)發(fā)生泄漏硝岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一袋毙、第九天 我趴在偏房一處隱蔽的房頂上張望辈讶。 院中可真熱鬧,春花似錦娄猫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碍讯,卻和暖如春悬蔽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捉兴。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工蝎困, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倍啥。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓禾乘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虽缕。 傳聞我的和親對象是個殘疾皇子始藕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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

  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,352評論 0 35
  • 概述 在多數(shù)移動應(yīng)用中任何時候都只能有一個應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,511評論 1 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 先上github地址https://github.com/YardWill/react-webpack-gulp-...
    Yard閱讀 1,274評論 0 4
  • 一個人長大了氮趋,就很難痛快的說出自己的喜好了伍派,大多數(shù)時候是怕人笑話自己幼稚。 這不是真正的長大剩胁。 痛快說出自己想要什...
    勒尤閱讀 200評論 2 0