进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,iOS 的沙盒机制保证了每个 App 都有自己独享的内存空间。
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。
正在运行中的程序被称作进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间
iOS 一个 APP 只有一个进程,所以进程间通信就是 APP 间通信。
进程间通信有以下 8 种方式:
1.URL Scheme
这个是 iOS App 通信最常用到的通信方式,App1 通过 openURL
的方法跳转到 App2,并且在 URL 中带上想要的参数,有点类似 http 的 get 请求那样进行参数传递。这种方式是使用最多的最常见的,使用方法也很简单只需要源 App1 在 info.plist
中配置 LSApplicationQueriesSchemes
,指定目标 App2 的 scheme
;然后在目标 App2 的 info.plist
中配置好 URL types
,表示该 App 接受何种 URL scheme
的唤起。

2.Keychain
iOS 系统的 Keychain 是一个安全的存储容器,它本质上就是一个 sqllite 数据库,它的位置存储在 /private/var/Keychains/keychain-2.db
,不过它所保存的所有数据都是经过加密的,可以用来为不同的 App 保存敏感信息,比如用户名,密码等。iOS 系统自己也用 keychain 来保存 VPN 凭证和 Wi-Fi 密码。它是独立于每个 App 的沙盒之外的,所以即使 App 被删除之后,Keychain 里面的信息依然存在。
基于安全和独立于 App 沙盒的两个特性,Keychain 主要用于给 App 保存登录和身份凭证等敏感信息,这样只要用户登录过,即使用户删除了 App 重新安装也不需要重新登录。
那 Keychain 用于 App 间通信的一个典型场景也和 App 的登录相关,就是统一账户登录平台。使用同一个账号平台的多个 App,只要其中一个 App 用户进行了登录,其他 App 就可以实现自动登录不需要用户多次输入账号和密码。一般开放平台都会提供登录 SDK,在这个 SDK 内部就可以把登录相关的信息都写到 keychain中,这样如果多个 App 都集成了这个 SDK,那么就可以实现统一账户登录了。
Keychain 的使用比较简单,使用 iOS 系统提供的类 KeychainItemWrapper
,并通过 keychain access groups
就可以在应用之间共享 keychain 中的数据的数据了。
3.UIPasteboard
顾名思义, UIPasteboard 是剪切板功能,因为 iOS 的原生控件 UITextView
、UITextField
、UIWebView
,我们在使用时如果长按,就会出现复制、剪切、选中、全选、粘贴等功能,这个就是利用了系统剪切板功能来实现的。而每一个 App 都可以去访问系统剪切板,所以就能够通过系统剪贴板进行 App 间的数据传输了。
4.UIDocumentInteractionController
UIDocumentInteractionController 主要是用来实现同设备上 App 之间的共享文档,以及文档预览、打印、发邮件和复制等功能。它的使用非常简单.
首先通过调用它唯一的类方法 interactionControllerWithURL:
,并传入一个url(NSURL)
,为你想要共享的文件来初始化一个实例对象。然后UI DocumentInteractionControllerDelegate
,然后显示菜单和预览窗口。
5.local socket
这种方式不太常见,也是很容易被 iOS 开发者所忽略但是特别实用的一种方法。它的原理很简单,一个 App1 在本地的端口 port1234 进行 TCP 的 bind 和 listen,另外一个 App2 在同一个端口 port1234 发起 TCP 的 connect 连接,这样就可以建立正常的 TCP 连接,进行 TCP通信了,那么就想传什么数据就可以传什么数据了。
这种方式最大的特点就是灵活,只要连接保持着,随时都可以传任何相传的数据,而且带宽足够大。它的缺点就是因为iOS系统在任意时刻只有一个app在前台运行,那么就要通信的另外一方具备在后台运行的权限,像导航或者音乐类app。
它是常用使用场景就是某个App1具有特殊的能力,比如能够跟硬件进行通信,在硬件上处理相关数据。而App2则没有这个能力,但是它能给App1提供相关的数据,这样APP2跟App1建立本地socket连接,传输数据到App1,然后App1在把数据传给硬件进行处理。
6.AirDrop
通过 AirDrop 实现不同设备的 App 之间文档和数据的分享;
7.UIActivityViewController
iOS SDK 中封装好的类在 App 之间发送数据、分享数据和操作数据;
8.App Groups
App Group 用于同一个开发团队开发的 App 之间,包括 App 和 Extension 之间共享同一份读写空间,进行数据共享。同一个团队开发的多个应用之间如果能直接数据共享,大大提高用户体验。
网友评论