Darwin Notification
# 介面
關於 Darwin Notification 的介面,都是 C API,最基本的使用類似於這樣:
// RegisterCFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, callback, CFSTR("Notification Name"), NULL,CFNotificationSuspensionBehaviorDeliverImmediately);// PostCFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("Notification Name"), NULL, NULL, TRUE);// Callbackvoid callback(CFNotificationCenterRef center, void * observer, CFStringRef name, const void * object, CFDictionaryRef userInfo) { }
其中 callback 是一個 C 函數,用於處理收到通知的回調,Notification Name 表示通知名稱。
不過其實如果不需要傳遞參數的話,還可以有更簡單調用,雖然也是 C API
// Registerint token = 0;notify_register_dispatch("Notification Name", &token, dispatch_get_main_queue(), ^(int token) { });// Postnotify_post("Notification Name");
這種方式被定義在 notify.h 這個頭裡面,最大的好處是不用寫一大堆代碼,還能用 Block 來處理回調。當然缺陷就是這個 notify_post 是不能攜帶參數的。
不管怎麼樣,C API 總是不能算好用的,GitHub 上面能找到一些 Darwin Notification 的封裝,例如這個 CCHDarwinNotificationCenter
# 系統 Darwin Notification
在QQ音樂的早期實現裡面(意思是現在我不確定是否還這樣),有依賴 Darwin Notification 來做些事情,具體來說是鎖屏歌詞這件事情。鎖屏歌詞是利用圖片合成文字設置鎖屏圖片的一個效果,但如果實時去合成的話,那性能的損耗大多是沒有必要的。所以QQ音樂只會在鎖屏並且屏幕被點亮的時候,才去做鎖屏歌詞的更新。
具體來說是兩個通知
com.apple.springboard.lockcompletecom.apple.springboard.lockstate
這兩個通知配合起來就能做上述的事情。
# 跨進程通信
對於有多個 App Extension 的 app,難免會出現一個插件要給另一個插件發消息的情況。例如這個
分詞插件是用於處理剪貼板數據的,而剪貼板數據可能會因為用戶點擊剪貼板插件的內容而更新,這個時候只需要用戶點擊剪貼板的時候,發一個 Darwin Notification 給分詞插件,分詞插件就完成了更新。
Darwin Notification 還能進行跨應用的通知,例如小歷和 Pin 的通信
當用戶在日曆插件上面複製了一個日曆的時候,另一個 app 的插件也立刻知道了這個事情,看起來就好像這個插件聯動了一樣。
# 早期的 WatchKit
如果搞過 watchOS 1.0 的開發的話,會知道那個時候其實是木有 WatchConnectivity Framework 的,雖然我也不覺得 watchOS 2 的 WatchConnectivity 好用,但那個時候 watch target 想要和 app target 通信,只有兩個方法:
1. openParentApplication
2. Darwin Notification
早期的 MMWormhole 就是基於 Darwin Notification,第一版的 QQ音樂 Apple Watch 端也是通過到處收發 Darwin Notification 去做的。
沒太多內容,差不多就是這樣
- EOF -
推薦閱讀:
※UI 設計師提供 iOS 字體和長度應當用什麼單位?
※27歲,想轉行做軟體。從頭開始學JAVA IOS開發 運維 等等其中之一求指教?
※大家對同步推的客戶端公然上了App Store怎麼看?
※如何禁止 iPhone Safari 視頻自動全屏?
※WP8、iOS有沒有許可權機制?