CFMessagePort属于CoreFoundation框架中的类。因此可以在http://opensource.apple.com/tarballs/CF/CF-855.17.tar.gz中在源码,如果感兴趣可以去看看。

下面说下CFMessagePortRef的具体使用。

首先创建一个工程作为消息的接受者。

#import "ViewController.h"#define LOCAL_MACH_PORT_NAME    "com.message.demo"@interface ViewController ()
{CFMessagePortRef        mMsgPortListenner;
}@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.UIButton *startPortButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 120, 40)];[startPortButton setTitle:@"Start " forState:UIControlStateNormal];startPortButton.backgroundColor = [UIColor grayColor];[startPortButton addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:startPortButton];UIButton *endPortButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 300, 120, 40)];[endPortButton setTitle:@"End " forState:UIControlStateNormal];endPortButton.backgroundColor = [UIColor grayColor];[endPortButton addTarget:self action:@selector(end) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:endPortButton];}CFDataRef onRecvMsgCallBack(CFMessagePortRef local,SInt32 msgid,CFDataRef cfData,void *info)
{NSLog(@"local = %@",local);NSLog(@"msgid = %d",msgid);NSString *strData = nil;if (cfData){const UInt8  * recvedMsg = CFDataGetBytePtr(cfData);strData = [NSString stringWithCString:(char *)recvedMsg encoding:NSUTF8StringEncoding];/**实现数据解析操作**/NSLog(@"receive message:%@",strData);}//为了测试,生成返回数据NSString *returnString = [NSString stringWithFormat:@"i have receive:%@",strData];const char* cStr = [returnString UTF8String];NSUInteger ulen = [returnString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];CFDataRef sgReturn = CFDataCreate(NULL, (UInt8 *)cStr, ulen);return sgReturn;
}- (void)start
{if (0 != mMsgPortListenner && CFMessagePortIsValid(mMsgPortListenner)) {CFMessagePortInvalidate(mMsgPortListenner);}mMsgPortListenner = CFMessagePortCreateLocal(kCFAllocatorDefault, CFSTR(LOCAL_MACH_PORT_NAME), onRecvMsgCallBack, NULL, NULL);CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, mMsgPortListenner, 0);CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);NSLog(@"start");
}

解释下面接收接收方法参数的意思

CFMessagePortRef  指接受消息对象的相关信息

例如:

local = <CFMessagePort 0x7f8391c0a110 [0x10800c7b0]>{locked = Maybe, valid = Yes, remote = No, name = com.message.demo, source = 0x7f8391d08240, callout = onRecvMsgCallBack (0x107362440), context = <CFMessagePort context 0x0>}

SInt32 msgid 给单条消息的标记

CFDataRef data  是消息发送的内容

void *info    可以携带其他数据对象进行传递,通常为空。

接下来再创建一个工程作为消息的发送者

#import "ViewController.h"@interface ViewController ()
{UITextField *textField;
}
@end
#define MSG_PORT "com.message.demo"@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 100, 100, 30)];textField.backgroundColor = [UIColor grayColor];[self.view addSubview:textField];UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];[btn setTitle:@"Send" forState:UIControlStateNormal];[btn addTarget:self action:@selector(sendMethod) forControlEvents:UIControlEventTouchUpInside];btn.frame = CGRectMake(50, 150, 100, 50);[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];[self.view addSubview:btn];}
- (void)sendMethod
{[self sendMessageToDameonWith:textField.text msgID:101];}- (NSString *)sendMessageToDameonWith:(id)msgInfo msgID:(SInt32)msgid
{CFMessagePortRef bRemote = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR(MSG_PORT));if (nil == bRemote) {NSLog(@"bRemote create failed");return nil;}NSString *msg = [NSString stringWithFormat:@"%@",msgInfo];NSLog(@"send msg is :%@",msg);const char *message = [msg UTF8String];CFDataRef data,recvData = nil;data = CFDataCreate(NULL, (UInt8 *)message, strlen(message));/* 发送消息 */CFMessagePortSendRequest(bRemote, msgid, data, 0, 100, kCFRunLoopDefaultMode, &recvData);if (nil == recvData) {NSLog(@"recvData data is nil.");CFRelease(data);CFMessagePortInvalidate(bRemote);CFRelease(bRemote);return nil;}const UInt8 *recvedMsg = CFDataGetBytePtr(recvData);if (nil == recvedMsg) {NSLog(@"receive data err.");CFRelease(data);CFMessagePortInvalidate(bRemote);CFRelease(bRemote);return nil;}NSString *strMsg = [NSString stringWithCString:(char *)recvedMsg encoding:NSUTF8StringEncoding];NSLog(@"%@",strMsg);CFRelease(data);CFMessagePortInvalidate(bRemote);CFRelease(bRemote);CFRelease(recvData);return nil;
}

代码下载地址:http://download.csdn.net/detail/qqmcy/9450336

iOS--CFMessagePort实现进程间通信相关推荐

  1. iOS内IPC(进程间通信)方法小结

    转自:http://blog.csdn.net/lifengzhong/article/details/7739539 受限与iOS系统的运行机制,绝大多数情况下一个应用在进入后台后会马上进入susp ...

  2. iOS进程间通信之CFMessagePort

    iOS进程间通信之CFMessagePort   iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中.尽管如此,iOS还是提供了若干进程间通信机制,CFMessagePort就是其 ...

  3. iOS 知识点整理 (持续更新...)

    整理了些iOS相关的基础问题,每个问题可能会再写些扩展,需要具体了解可以看题目下方的链接 如有错漏,欢迎指出,谢谢 一.Swift 1.给一个数组,要求写一个函数,交换数组中的两个元素(swift可用 ...

  4. Android iOS 开发全面对比分析

    1 前言 Android和iOS是移动端的两大平台,Android以它的开源.易上手.开发成本低而受到广大开发者的青睐,而iOS作为苹果的封闭系统,以它的简单.流畅高效.高冷等特点也吸引了一大批果粉开 ...

  5. iOS 系统分析(一) 阅读内核准备知识

    原文出自[听云技术博客]:http://blog.tingyun.com/web/a... 0x01 iOS体系架构 1.1 iOS 系统的整体体系架构 用户体验( The User Experien ...

  6. iOS事件处理,看我就够了~

    该文章属于<简书 - 刘小壮>原创,转载请注明: <简书 - 刘小壮> https://www.jianshu.com/p/b0884faae603 好久没写博客了,前后算起来 ...

  7. iOS NSRunloop 详解

    概念 Runloop就像它的名字一样,就是跑环.我的理解就是一个死循环.是一个可以随时睡眠,随时唤醒的死循环 大家可以想一下,手机app为什么会一直运行?而且在接收到用户点击等等操作时就会有所反映.这 ...

  8. 转载 一个渣硕iOS春招总结 | 掘金技术征文

    https://www.qingtingip.com/h_219584.html 地处北方一隅,今年很多公司春招没来现场,所以基本都是提前批的线上面试,整个三月都过的比较累,4月份的校招应该不参加了, ...

  9. iOS - Socket 网络套接字

    1.Socket 套接字 所谓 Socket,通常称为 "套接字",网络应用程序通过套接字向网络发送请求或者应答网络请求.Socket 通常用于描述 IP 地址和端口,是应⽤层与 ...

  10. android 线程信号量,iOS开发 多线程的高级应用-信号量semaphore

    在iOS开发的道路上,多线程的重要性不言而喻. 大部分我们都停留在基础的使用上面.缺乏高级应用. 缺乏提升,是因为我们面对他太少,复杂的事情重复做,复杂的事务基础化. 差距就是这样拉开了 言归正传: ...

最新文章

  1. python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)
  2. Github近期最有趣的10款机器学习开源项目
  3. Python中下划线---完全解读
  4. git 创建webpack项目_一次create-react-app创建项目升级webpack的流水账
  5. 异常处理 Exception
  6. netmiko可以连接的设备有哪些_气体报警器可以联动哪些设备
  7. OpenCV探索之路(九):模板匹配
  8. 中文验证码识别 java_opencv Tesseract 验证码识别 文字识别
  9. 一个问题,被人问是否确定,千万不要随口回答确定
  10. vc2008工程转vc2005
  11. GMP文件分类与编码管理规程
  12. js 小写金额转大写金额
  13. 台式电脑怎么组装步骤_台式机组装教程,详细教您台式机怎么组装
  14. 售前工程师面试准备工作及经验分享
  15. 常用的oracle时间计算
  16. 跳动爱心代码-李峋同款爱心代码(升级版)
  17. 一个完整的项目管理流程
  18. Solidworks如何绘制螺纹
  19. 工业机器人到底涉及了哪些高科技?
  20. 今天遭到鄙视了。突然感觉自己昏昏沉沉的过日子 究竟不是个事 自己得努力了!~!

热门文章

  1. Onenote 同步 PAC加速方式
  2. 日期格式不一致问题处理
  3. 安全态势攻防赛事可视化,助力网络安全发展
  4. DBeaver,一款数据库管理工具
  5. ANIMO 03 汉化补丁
  6. 八、Linux全套大总结
  7. php制作万年历的步骤_PHP制作万年历
  8. 图像处理(一):傅里叶变换简单讲解
  9. matplotlib使用cmap
  10. android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...