iOS进程间通信之CFMessagePort
本文转载至 http://www.cocoachina.com/industry/20140606/8701.html
iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中。尽管如此,iOS还是提供了若干进程间通信机制,CFMessagePort就是其中之一。

- -(void)startListenning
- {
- if (0 != mMsgPortListenner && CFMessagePortIsValid(mMsgPortListenner))
- {
- CFMessagePortInvalidate(mMsgPortListenner);
- }
- mMsgPortListenner = CFMessagePortCreateLocal(kCFAllocatorDefault,CFSTR(LOCAL_MACH_PORT_NAME),onRecvMessageCallBack, NULL, NULL);
- CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, mMsgPortListenner, 0);
- CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
- NSLog(@"start listenning");
- }
- #define LOCAL_MACH_PORT_NAME "com.wangzz.demo"
- typedef CFDataRef (*CFMessagePortCallBack) (
- CFMessagePortRef local,
- SInt32 msgid,
- CFDataRef data,
- void *info
- );
- CFDataRef onRecvMessageCallBack(CFMessagePortRef local,SInt32 msgid,CFDataRef cfData, void*info)
- {
- NSLog(@"onRecvMessageCallBack is called");
- 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)endLisenning
- {
- CFMessagePortInvalidate(mMsgPortListenner);
- CFRelease(mMsgPortListenner);
- }
- -(NSString *)sendMessageToDameonWith:(id)msgInfo msgID:(NSInteger)msgid
- {
- // 生成Remote port
- CFMessagePortRef bRemote = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR(MACH_PORT_REMOTE));
- if (nil == bRemote) {
- NSLog(@"bRemote create failed");
- return nil;
- }
- // 构建发送数据(string)
- 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 date is nil.");
- CFRelease(data);
- CFMessagePortInvalidate(bRemote);
- CFRelease(bRemote);
- return nil;
- }
- // 解析返回数据
- const UInt8 * recvedMsg = CFDataGetBytePtr(recvData);
- if (nil == recvedMsg) {
- NSLog(@"receive date 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 strMsg;
- }
- #define MACH_PORT_REMOTE "com.wangzz.demo"
| This method is not available on iOS 7 and later—it will return NULL and log a sandbox violation in syslog. See Concurrency Programming Guide for possible replacement technologies. |
iOS进程间通信之CFMessagePort的更多相关文章
- iOS刨根问底-深入理解RunLoop
开源的RunloopRef 通常所说的RunLoop指的是NSRunloop或者CFRunloopRef,CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的OC ...
- iOS 系统分析(一) 阅读内核准备知识
➠更多技术干货请戳:听云博客 0x01 iOS体系架构 1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer ):SpringBoard 同时支持 Spo ...
- IOS随机随学
1.Objective-C是一种面向对象的语言. 2.Objective-C类声明和实现包括两个部分:接口部分和实现部分. 3.Objective-C中方法不是在“.”运算符,而是采用“[]”运算符. ...
- iOS多线程实现1-pthread
1 操作系统.进程.线程简单介绍 现在的程序都是在操作系统上跑,很少有裸机的,而且大部分的嵌入式应用也都支持操作系统,当然还有一些很低端的嵌入式设备没有操作系统. iPhone手机跑的是iOS操作系统 ...
- iOS的TCP/IP协议族剖析&&Socket
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有S ...
- iOS中多线程原理与runloop介绍
一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...
- IOS基础面试题
最近离职了,找工作,光会做项目,对基础不熟,今天就总结了一点面试题. 废话不多说,上题吧: 1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么. 基本类型和C一样,主要 ...
- iOS多线程介绍
一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...
- ios开发--tcp/ip
简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久!你能耐心看完吗?) 我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角 ...
随机推荐
- poj 2318 TOYS 点与矩形的关系
题目链接 题意 有一个矩形盒子,\(n(n\leq 5e4)\)条线段将其分成了\(n+1\)个区域(每条线段的两个端点分别在矩形的上边和下边,且线段互不相交).现向盒子中扔\(m(m\leq 5e4 ...
- 眉目传情之匠心独运的kfifo【转】
转自:http://blog.csdn.net/chen19870707/article/details/39899743 权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一 ...
- Python的格式化输出,基本运算符,编码
一. 格式化输出现在有以下需求,让用户输入name, age, job,hobby 然后输出如下所示: -----------info of Alex Li----------- Name : Ale ...
- (1)sqlite基础
一.安装sqlite 下载页面:http://www.sqlite.org/download.html 1.下载 sqlite-tools-win32-*.zip 和 sqlite-dll-win32 ...
- OS | 冯诺伊曼体系和哈佛体系
冯·诺伊曼结构(von Neumann architecture),也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的计算机设计概念结构.本词描述的是一种实现通用图灵机的计算设备,以及一 ...
- Parameter Binding in ASP.NET Web API #Reprinted
http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
- Ubuntu 16.04安装字体管理工具
注意:这个字体管理工具只是简化了字体的安装和卸载,并没有快速下载字体去自动安装,所有的字体都是需要自行下载,因为字体本身是有版权的. 安装: sudo apt-get install font-man ...
- php 打印今天,昨天,本周,上周,当月,上月,本季,上季,今年,去年数据
if($filter['mode']) { switch ($filter['mode']) { case 1://今天的数据 $time_start = date("Y-m-d H:i:s ...
- ios使用http来上传图片实现方法
if (parameters) { int genderNumber = 1; self.token = loginToken; self.p ...
- 在Android Studio下使用Hierarchy Viewer
前言 最近看到这篇文章<Android UI性能优化详解>,里面使用了Hierarchy Viewer来对布局进行优化.开发android这么久了,一直都有听过这个工具,但是重来都没真正去 ...