几种Cocoa开发中的IPC方案

​ iOS系统相对于Android系统来说非常的封闭,每个应用的活动范围被严格地限制在各自的沙盒中,也许这是为了保证系统的安全性,避免恶意的应用去偷取其他应用的隐私信息。不过这同时也就阻碍了系统中应用之间或者与Extension间某些必要的跨进程通信。

​ Unix系统提供很多进程间通信的渠道,比如pipe、FIFO、共享内存、消息队列、信号等方式,但是iOS非越狱系统都对这些层级的API加了权限,调用这些接口会出现Permission Denied的错误警告。

尽管如此,iOS还是提供了若干IPC的策略方案,下面就来整理一下:

一、URL Schema

​ 简单来说,URL Schema就是iOS内的应用调用协议,应用A可以声明自定义的调用协议,就如http/https那样,当另一个应用B打算在应用内打开应用A时,可以打开使用A自定义的协议开头的URL来打开A,除了协议头,URL中还可以附加其他参数。此外,这些协议还可以通过Safari访问打开某个特定的应用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvRbJxqP-1577180499914)(/Users/aesthetic/Desktop/屏幕快照 2019-03-18 下午5.08.28.png)]

在Xcode的Info.plist里面可以自由定义该应用的协议头,然后通过形似“协议头://xxx”的URL便可以打开了。

消息接收端(在AppDelegate.m文件里):

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([sourceApplication isEqualToString: @"xxx.xxx.xxx"]) {
        //...解析URL的参数
    }
    return YES;
}

消息发送端:

//URL中://后可以跟需要传递的参数
NSURL* url = [NSURL URLWithString: @"xxx://xxx"];
[[UIApplication sharedApplication] openURL: url];

这种方式普遍存在于现在很多应用的分享SDK中,比如微信、微博、QQ等。

不过这种方式有以下缺点

1、同一时刻还是只能有一个进程在前台,主动呼叫的应用在调用成功后必须进入后台,所以能传递的只有URL中所带的参数或annotation中所带的参数。

2、调用的过程中会出现应用之间的切换,用户体验不好。即不能够直接在本应用内进行远程分享。

二、Distributed Notifications
(1)NSDistributedNotificationCenter

​ 每 一个进程都有一个默认的DistributedNotificationCenter,你可以通过访问 NSDistributedNotificationCenter 的 +defaultCenter方法来得到它。这种类型的NotificationCenter负责管理一台机器上多个进程之间的Notification。

​ 发送一个DistributedNotification是非常昂贵的。 Notification首先会被发送到一个系统级别的服务器上,然后在分别分发到每一个注册过的进程里。从发消息到消息被接受到之间的延迟理论上来说是无限的。事实上,如果太多的Notification被发送到服务器上,那么服务器上的Notification队列可能会被撑满,这就有可能会造成Notification的丢失。

​ DistributedNotification会在一个进程的主循环里被发送出去。一个进程必须保证有一个主循环在其内部运行,例如 NSDefaultRunLoopMode,然后才能接受到DistributedNotification。如果接收进程是多线程的, 那么Notification并不一定会被主线程接受到。 一般来说Notification会被分发到主线程的主循环,但是其他线程一样可以接收到。NSDistributedNotificationCenter的使用方法如下:

//发送方发送通知
/*
notificationSender:被发送的对象(只能是字符串,但可以通过NSData和NSString的相互转换来传递数据)  
userInfo:关于该通知的信息(有时候通过它来传递数据比字符串方便)
*/
- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo;

//接收方接收通知
/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值