CFNotificationCenterRef是iOS 进程间通信的一种方式,是一种通知的机制,适用于container app 与 extension app进行通信。
使用之前,需要为container app与extension app设置 App Group,这样才能接收到彼此发送的进程间通知。
进程间通信如果需要传递复杂的数据,可以使用第三方库MMWormhole,网络上相关的教程非常多
- 简单使用:
CFStringRef name = CFSTR("customName");
CFNotificationCenterRef center = CFNotificationCenterGetDarwinNotifyCenter();
//添加观察者
CFNotificationCenterAddObserver(center,
(const void *)self,
customNotification,
name,
NULL,
kCFNotificationDeliverImmediately);
//发送通知
CFNotificationCenterPostNotification(center,
name,
(const void *)self,
NULL,
kCFNotificationDeliverImmediately);
- 监听iOS 锁屏事件
//com.apple.springboard.lockstate
//之所以这样写是因为苹果明确不让开发者监听设备锁屏的情况,代码静态审核会不通过
NSString *com = @"com";
NSString *apple = @"apple";
NSString *spring = @"spring";
NSString *board = @"board";
NSString *lock = @"lock";
NSString *state = @"complete";
self.lockCenterName = [NSString stringWithFormat:@"%@.%@.%@%@.%@%@",com,apple,spring,board,lock,state];
CFStringRef strRef = (__bridge CFStringRef)self.lockCenterName;
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
NULL,
NULL,
strRef,
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
发送通知时的选项
typedef CF_ENUM(CFIndex, CFNotificationSuspensionBehavior) {
//当进程/应用程序在后台时,服务器不会用这个名称和对象对任何通知进行排队。
CFNotificationSuspensionBehaviorDrop = 1,
//服务器只对指定名称和对象的最后一个通知进行排队;较早的通知将被删除。
CFNotificationSuspensionBehaviorCoalesce = 2,
//服务器将保存所有匹配的通知,直到队列被填满(队列大小由服务器决定),此时服务器可能刷新排队的通知。
CFNotificationSuspensionBehaviorHold = 3,
//无论进程是否在后台,服务器都会发送与此注册匹配的通知。当匹配具有此暂停行为的通知时,它的效果是首先刷新任何排队的通知。
CFNotificationSuspensionBehaviorDeliverImmediately = 4
};
- 在工程中添加extension
- 设置 App Groups,格式如下:
group.com.公司名.项目名
举例:
group.com.apple.test