Darwin Notification

在 iOS 開發裡面,通知是一種常用的機制,Foundation 框架提供了 NSNotificationCenter 用於註冊和發送通知。但是這種通知只能提供應用內的同一個進程間的消息收發,而 Darwin Notification 可以提供跨進程的消息,也能接收到系統發出一些消息,它位於 CoreFoundation 裡面,本文對其做一個簡單的介紹。

# 介面

關於 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有沒有許可權機制?

TAG:iOS | iOS开发 | Cocoa |