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族中的协议,今天主角 ...
随机推荐
- 莫比乌斯函数之和(51nod 1244)
莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.具体定义如下: 如果一个数包含平方因子,那么miu(n) = 0.例如 ...
- 2017 UESTC Training for Data Structures-解题报告
题目链接:http://acm.uestc.edu.cn/#/contest/show/155 这个数据结构训练主要针对线段树,树转数组和并查集.比较适合刚入门数据结构的同学. 注意,因为后面题的代码 ...
- 常用的XMPP服务器
1. Openfire (Wildfire) 3.x 底层通讯采用的mina框架,minak框架其实性能一般,netty早已经超越它,虽然最初都是Doug Lea写的.3.4版本之后支持集群,单台服务 ...
- dedecms--后台添加会员栏目(批量添加)
最近在用dedecms二次开发会员功能,一开始做了一个会员添加,但是领导要求可以批量添加,最好是可以输入添加个数:这样我想添加几个就添加几个了 1:会员添加的htm页面 <html> &l ...
- IOS-<input>表单元素只能读,设置readonly时光标仍然可见的解决办
在HTML中,如果把一个<input>的readonly属性设置为"readonly",表示这个表单元素不能编辑. 但是,鼠标点击之后,这个表单元素还是有光标存在的. ...
- R语言实战读书笔记(八)回归
简单线性:用一个量化验的解释变量预测一个量化的响应变量 多项式:用一个量化的解决变量预测一个量化的响应变量,模型的关系是n阶多项式 多元线性:用两个或多个量化的解释变量预测一个量化的响应变量 多变量: ...
- Codeforces 786B Legacy(线段树优化建图)
题目链接 Legacy 首先对于输入的$n$,建立一棵线段树. 显然线段树有大概$2n$个结点,每个节点对应一段区间 我们把这$2n$个结点加入我们的无向图中,一起跑最短路. 具体连边方案: 我们把 ...
- JavaScript 中那些关于坐标和距离的属性与方法
一 前言 在前端开发中总会遇到各种各样需要使用或计算坐标和距离的情况,但是这些属性和方法众多,全部熟练地记下来并非是一件易事,大多只能现查,耗费不少时间精力,于是便有了整理记录的想法,即加深了印象,又 ...
- 洛谷——P2706 巧克力
P2706 巧克力 题目背景 王7的生日到了,他的弟弟准备送他巧克力. 题目描述 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒 ...
- Boost Asio介绍--之一
原文:http://www.tuicool.com/articles/YbeYR3 Boost Asio介绍--之一 时间 2014-03-26 17:57:39 CSDN博客 原文 http:/ ...