本人从事iOS开发快要第六个年头,期间也做过多款app,关于app间的通讯也用过两个方式,今天就来浅谈一下iOS关于app之间的几种常见通信方式,如果不对还忘多多指教!
一、URL Scheme :
ios常用的通信方式,app1
通过openURl(开放链接)
的方法跳转到app2
,并且在url中带上想要的参数,需要配置info.plist
文件,添加URL Scheme
,并把对应的URL Scheme
对方的白名单中,这种场景主要用于各大平台的分享
例如:
-(void)openScheme:(NSString *)scheme {
UIApplication*application = [UIApplication sharedApplication];
NSURL *URL = [NSURLURLWithString:scheme];
//iOS10及以后
if([applicationrespondsToSelector:@selector(openURL:options:completionHandler:)]) {
[applicationopenURL:URL options:@{}
completionHandler:^(BOOLsuccess) {
NSLog(@"Open%@: %d",scheme,success);
}];
}else{
//iOS10以前
BOOL success =[application openURL:URL];
NSLog(@"Open%@: %d",scheme,success);
}
}
二、Keychain :
iOS系统的Keychain
是苹果公司 Mac OS(也包含 Mac OSX)
中的密码管理系统的存储容器,它本质上就是一个sqllite
数据库,。它的位置存储在/private/var/Keychains/keychain-2.db
,不过它所保存的所有数据都是经过安全加密的,可以包含许多种类型的数据:密码(包括网站、FTP服务器、SSH账户、网络共享、无线网络、群组软件、加密磁盘镜像)
,私钥
,电子证书
、加密笔记
等。
它是独立于每个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
中的数据的数据了。
1、存储数据的方法
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result)
@attributes
: 是要添加的数据。
@result
: 这是存储数据后,返回一个指向该数据的引用,如果不是使用该引用时可以传入 NULL
2、根据条件查询数据
OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)
@query
: 要查询数据的条件。
@result
: 根据条件查询得到数据的引用。
3、更新数据
OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_2_0);
@query
: 要更新数据的查询条件。
@attributesToUpdate
: 要更新的数据。
4、删除数据
OSStatus SecItemDelete(CFDictionaryRef query) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_2_0);
@query
: 删除的数据的查询条件。
总结:
以上四个方法,就是Keychain 的常用的四个方法,也就是 增、删、改、查 。一般应用这四个方法就可以完全满足
3、UIPasteboard
UIPasteboard
是剪切板功能,因为iOS的原生控件UITextView
,UITextField
、UIWebView
,我们在使用时如果长按,就会出现复制
、剪切
、选中
、全选
、粘贴
等功能,这个就是利用了系统剪切板功能来实现的。使用场景就是淘宝
跟微信/QQ
的链接分享。由于腾讯和阿里的公司战略,腾讯
在微信
和qq
中都屏蔽
了淘宝的链接
。那如果淘宝用户
想通过QQ
或者微信
跟好友分享某个淘宝商品
,怎么办呢? 阿里的工程师就巧妙的利用剪贴板实现了这个功能。首先淘宝app中将链接自定义成淘口令
,引导用户进行复制
,并去QQ好友对话中粘贴
。然后QQ好友收到消息后复制再打开自己的淘宝app
,淘宝app每次从后台切到前台时,就会检查系统剪切板中是否有淘口令,如果有淘口令就进行解析并跳转到对于的商品页面
。
4、UIDocumentInteractionController
UIDocumentInteractionController
主要是用来实现同设备上app之间的共享文档
,以及文档预览
、打印
、发邮件
和复制
等功能。它的使用非常简单.
首先通过调用它唯一的类方法 interactionControllerWithURL
:,并传入一个URL(NSURL)
,为你想要共享的文件来初始化一个实例对象。然后UIDocumentInteractionControllerDelegate
,然后显示菜单和预览窗口。
效果:
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
在把数据传给硬件进行处理。
本文参考自 云峰小罗:iOS间的五种通信