iOS app之间常用的几种通信方式

本人从事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的原生控件UITextViewUITextFieldUIWebView,我们在使用时如果长按,就会出现复制剪切选中全选粘贴等功能,这个就是利用了系统剪切板功能来实现的。使用场景就是淘宝微信/QQ的链接分享。由于腾讯和阿里的公司战略,腾讯微信qq中都屏蔽淘宝的链接。那如果淘宝用户想通过QQ或者微信跟好友分享某个淘宝商品,怎么办呢? 阿里的工程师就巧妙的利用剪贴板实现了这个功能。首先淘宝app中将链接自定义成淘口令引导用户进行复制并去QQ好友对话中粘贴。然后QQ好友收到消息后复制再打开自己的淘宝app淘宝app每次从后台切到前台时,就会检查系统剪切板中是否有淘口令,如果有淘口令就进行解析并跳转到对于的商品页面

UIPasteboard代码

4、UIDocumentInteractionController

UIDocumentInteractionController主要是用来实现同设备上app之间的共享文档,以及文档预览打印发邮件复制等功能。它的使用非常简单.

首先通过调用它唯一的类方法 interactionControllerWithURL:,并传入一个URL(NSURL),为你想要共享的文件来初始化一个实例对象。然后UIDocumentInteractionControllerDelegate,然后显示菜单和预览窗口。

UIDocumentInteractionController代码

效果:
UIDocumentInteractionController实现效果.png

5、local socket

这种方式不太常见,也是很容易被iOS开发者所忽略但是特别实用的一种方法。它的原理很简单,一个App1本地的端口port1234进行TCPbindlisten,另外一个App2同一个端口port1234发起TCP的connect连接,这样就可以建立正常的TCP连接,进行TCP通信了,那么就想传什么数据就可以传什么数据了。

这种方式最大的特点就是灵活,只要连接保持着,随时都可以传任何相传的数据,而且带宽足够大。它的缺点就是因为iOS系统在任意时刻只有一个app在前台运行,那么就要通信的另外一方具备在后台运行的权限,像导航或者音乐类app。

它是常用使用场景就是某个App1具有特殊的能力,比如能够跟硬件进行通信,在硬件上处理相关数据。而App2则没有这个能力,但是它能给App1提供相关的数据,这样APP2App1建立本地socket连接,传输数据到App1,然后App1在把数据传给硬件进行处理。

本文参考自 云峰小罗:iOS间的五种通信

你可能感兴趣的:(iOS app之间常用的几种通信方式)