iOS--CFMessagePort实现进程间通信
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实现进程间通信相关推荐
- iOS内IPC(进程间通信)方法小结
转自:http://blog.csdn.net/lifengzhong/article/details/7739539 受限与iOS系统的运行机制,绝大多数情况下一个应用在进入后台后会马上进入susp ...
- iOS进程间通信之CFMessagePort
iOS进程间通信之CFMessagePort iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中.尽管如此,iOS还是提供了若干进程间通信机制,CFMessagePort就是其 ...
- iOS 知识点整理 (持续更新...)
整理了些iOS相关的基础问题,每个问题可能会再写些扩展,需要具体了解可以看题目下方的链接 如有错漏,欢迎指出,谢谢 一.Swift 1.给一个数组,要求写一个函数,交换数组中的两个元素(swift可用 ...
- Android iOS 开发全面对比分析
1 前言 Android和iOS是移动端的两大平台,Android以它的开源.易上手.开发成本低而受到广大开发者的青睐,而iOS作为苹果的封闭系统,以它的简单.流畅高效.高冷等特点也吸引了一大批果粉开 ...
- iOS 系统分析(一) 阅读内核准备知识
原文出自[听云技术博客]:http://blog.tingyun.com/web/a... 0x01 iOS体系架构 1.1 iOS 系统的整体体系架构 用户体验( The User Experien ...
- iOS事件处理,看我就够了~
该文章属于<简书 - 刘小壮>原创,转载请注明: <简书 - 刘小壮> https://www.jianshu.com/p/b0884faae603 好久没写博客了,前后算起来 ...
- iOS NSRunloop 详解
概念 Runloop就像它的名字一样,就是跑环.我的理解就是一个死循环.是一个可以随时睡眠,随时唤醒的死循环 大家可以想一下,手机app为什么会一直运行?而且在接收到用户点击等等操作时就会有所反映.这 ...
- 转载 一个渣硕iOS春招总结 | 掘金技术征文
https://www.qingtingip.com/h_219584.html 地处北方一隅,今年很多公司春招没来现场,所以基本都是提前批的线上面试,整个三月都过的比较累,4月份的校招应该不参加了, ...
- iOS - Socket 网络套接字
1.Socket 套接字 所谓 Socket,通常称为 "套接字",网络应用程序通过套接字向网络发送请求或者应答网络请求.Socket 通常用于描述 IP 地址和端口,是应⽤层与 ...
- android 线程信号量,iOS开发 多线程的高级应用-信号量semaphore
在iOS开发的道路上,多线程的重要性不言而喻. 大部分我们都停留在基础的使用上面.缺乏高级应用. 缺乏提升,是因为我们面对他太少,复杂的事情重复做,复杂的事务基础化. 差距就是这样拉开了 言归正传: ...
最新文章
- python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)
- Github近期最有趣的10款机器学习开源项目
- Python中下划线---完全解读
- git 创建webpack项目_一次create-react-app创建项目升级webpack的流水账
- 异常处理 Exception
- netmiko可以连接的设备有哪些_气体报警器可以联动哪些设备
- OpenCV探索之路(九):模板匹配
- 中文验证码识别 java_opencv Tesseract 验证码识别 文字识别
- 一个问题,被人问是否确定,千万不要随口回答确定
- vc2008工程转vc2005
- GMP文件分类与编码管理规程
- js 小写金额转大写金额
- 台式电脑怎么组装步骤_台式机组装教程,详细教您台式机怎么组装
- 售前工程师面试准备工作及经验分享
- 常用的oracle时间计算
- 跳动爱心代码-李峋同款爱心代码(升级版)
- 一个完整的项目管理流程
- Solidworks如何绘制螺纹
- 工业机器人到底涉及了哪些高科技?
- 今天遭到鄙视了。突然感觉自己昏昏沉沉的过日子 究竟不是个事 自己得努力了!~!