iOS进程间通信,CFNotificationCenterRef 简单使用

CFNotificationCenterRefiOS 进程间通信的一种方式,是一种通知的机制,适用于container appextension app进行通信。
使用之前,需要为container appextension 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
    图1
  • 设置 App Groups,格式如下:
group.com.公司名.项目名
举例:
group.com.apple.test
图2