CFNotificationCenter is an object representing a local or remote notification center, which is a singleton object of its type that receives notifications from different sources, and distributes them to the listeners.
Look up all observers of the local center
You can get the dictionary of all observers in the local center by doing this:
CFNotificationCenterRef center = CFNotificationCenterGetLocalCenter();
CFDictionaryRef dict = *(CFDictionaryRef*)(center + 4);
CFShow(dict);
Post notification with objects
DistributedCenter has been silently available since iOS 5. It can send property list objects(NSArray, NSDictionary, NSNumber, NSString, NSDate and NSData) to other processes.
// First, define function as external.
extern CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void);
// Sender.
CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionaryAddValue(dictionary, @"key of string", @1);
CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(), CFSTR("notification.identifier"), @"string object", dictionary, true);
CFRelease(dictionary);
...
// Call back function.
static void CallBackFunction(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
...
}
// Registration in receiver process.
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
NULL,
CallBackFunction,
CFSTR("notification.identifier"),
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
You can check if DistributedCenter can be used:
void *handle = dlopen("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", RTLD_LAZY);
void *impl = NULL;
if (handle)
impl = dlsym(handle, "CFNotificationCenterGetDistributedCenter");
if (impl) {
// Available.
}
References
- Official reference: http://developer.apple.com/iphone/library/documentation/CoreFoundation/Reference/CFNotificationCenterRef/Reference/reference.html
|