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族中的协议,今天主角 ...
随机推荐
- CSS实现Footer固定底部,超过一屏自动撑开
方法一:给html.body都设置100%的高度,确定body下内容设置min-height有效,然后设置主体部分min-height为100%,此时若没有header.footer则刚好完美占满全屏 ...
- VirtualBox 與 Vmware 差異
VirtualBox 4.3.36_Ubuntu r105129 與 VMware® Workstation 12 Player 12.5.2 build-4638234, 分別在各自的 Ubunt ...
- (49)C# npoi-word
//新建段落 XWPFParagraph p1 = doc.CreateParagraph(); //对齐方式 p1.SetAlignment(ParagraphAlignment.LEFT); p1 ...
- [WPF自定义控件库]以Button为例谈谈如何模仿Aero2主题
1. 为什么选择Aero2 除了以外观为卖点的控件库,WPF的控件库都默认使用"素颜"的外观,然后再提供一些主题包.这样做的最大好处是可以和原生控件或其它控件库兼容,而且对于大部分 ...
- 链表的排序 时间复杂度O(nlogn)
思路:用归并排序.对一个链表采用递归进行二等分,直到每个部分有序,然后对其进行合并.其实就是两步,先分解,然后合并有序链表. 代码: //对链表采用递归排序 class Solution { publ ...
- lodash常用
1) Loop for N times // 1. Basic for loop. for(var i = 0; i < 5; i++) { // .... } // 2. Using Arra ...
- 某考试 T3 sine
推完一波式子之后发现是个矩阵23333. 其实只要发现是矩阵之后就是个水题了. #include<bits/stdc++.h> #define ll long long using nam ...
- Java使用logback记录日志时分级别保存文件
说明:一般情况下logback可以指定类使用什么样的级别显示输出日志,并且同一类可以指定不能级别,然后对应级别进行输出日志. 第一种配置: <?xml version="1.0&quo ...
- Maven的构建生命周期理解
以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...
- CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.0'
这个一般是证书设置的问题, 在build settings中找到 Code Signing->Code Signing Identity修改成有效的证书即可