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族中的协议,今天主角 ...
随机推荐
- 阿狸的打字机(bzoj 2434)
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
- VMware锁定文件失败开启模块diskearly的操作失败未能启动虚拟机
删除虚拟机目录下的(如图中标明的就是D:\VMWorks\YeZiZxWeb这个目录)三个 *.lck文件夹,启动正常
- [转载][FPGA]有限状态机FSM学习笔记(二)
1. Mealy和Moore状态机的互换 对于给定的时序逻辑功能,可以用Mealy机实现,也可以用Moore机实现.根据Moore机比Mealy机输出落后一个周期的特性,可以实现两种状态机之间的转换. ...
- [转载][FPGA]Quartus代码保护-生成网表文件
0. 简介 当项目过程中,不想给甲方源码时,该如何?我们可以用网表文件qxp或者vqm对资源进行保护. 下面讲解这两个文件的具体生成步骤: 1. 基本概念 QuartusII的qxp文件为Quartu ...
- mybatis学习网站
http://www.mybatis.org/mybatis-3/zh/index.html
- MongoDb 出现配置服务不同步的处理
主要片方法就是用正常的配置文件的数据覆盖有问题的就行. 引用: http://dba.stackexchange.com/questions/48232/mongodb-config-servers- ...
- jquery 查找子元素的几种方法
<div class="tm-clear tb-hidden tm_brandAttr" id="J_BrandAttr" style="dis ...
- python为不同的对象如何分配内存的小知识
id方法的返回值就是对象的内存地址. python中会为每个出现的对象分配内存,哪怕他们的值完全相等(注意是相等不是相同).如执行a=2.0,b=2.0这两个语句时会先后为2.0这个Float类型对象 ...
- hdu5340 Three Palindromes(manacher算法)
题目描写叙述: 推断能否将字符串S分成三段非空回文串. 解题思路: 源码: #include <cstdio> #include <algorithm> #define MAX ...
- 更改已经签名的app中的内容
转载请说明出处http://blog.csdn.net/andywuchuanlong 记得上次在南昌中兴的一个项目中遇到过一个这种需求:一个app能够给多个渠道商去运营,渠道商推广出去能够获得对应的 ...