1、前言

  • iOS 系统是相对封闭的系统,App 各自在各自的沙盒(sandbox)中运行,每个 App 都只能读取 iPhone 上 iOS 系统为该应用程序程序创建的文件夹 AppData 下的内容,不能随意跨越自己的沙盒去访问别的 App 沙盒中的内容。

  • 所以 iOS 的系统中进行 App 间通信的方式也比较固定,常见的 App 间通信方式以及使用场景总结如下。

2、URL Scheme URL 协议

  • 这个是 iOS App 通信最常用到的通信方式,App1 通过 openURL 的方法跳转到 App2,并且在 URL 中带上想要的参数,有点类似 http 的 get 请求那样进行参数传递,这种方式是使用最多的最常见的。

  • 使用方法也很简单,只需要源 App1 在 info.plist 中配置协议白名单 LSApplicationQueriesSchemes,指定目标 App2 的 scheme。

  • 然后在目标 App2 的 info.plist 中配置好 URL types,表示该 App 接受何种 URL scheme 的唤起。

    • 或者在 TARGETS -> info 中设置。

  • 在源 App1 执行跳转方法中实现下面方法,进行跳转通信

    	// testApp2 为在 App2 中设置的协议 scheme
    NSURL *url = [NSURL URLWithString:@"testApp2://"]; // 判断能否跳转到 App2
    if ([[UIApplication sharedApplication] canOpenURL:url]) { // 跳转到 App2
    [[UIApplication sharedApplication] openURL:url]; } else {
    NSLog(@"没有安装应用");
    }
  • 典型的使用场景就是各开放平台 SDK 的分享功能,如分享到微信朋友圈微博等,或者是支付场景。比如从滴滴打车结束行程跳转到微信进行支付。

3、Keychain 钥匙串

  • iOS 系统的 Keychain 是一个安全的存储容器,它本质上就是一个 sqllite 数据库,它的位置存储在 /private/var/Keychains/keychain-2.db,不过它所保存的所有数据都是经过加密的,可以用来为不同的 App 保存敏感信息,比如用户名,密码等。iOS 系统自己也用 keychain 来保存 VPN 凭证和 WiFi 密码。它是独立于每个 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 中的数据的数据了。

  • 也可以使用 Keychain 的第三方框架 SSKeychain/SAMKeychain

    	// 存储密码
    [SSKeychain setPassword:@"password" forService:[NSBundle mainBundle].bundleIdentifier account:@"username"]; // 读取密码
    NSString *password = [SSKeychain passwordForService:[NSBundle mainBundle].bundleIdentifier account:@"username"]; // 删除密码
    [SSKeychain deletePasswordForService:[NSBundle mainBundle].bundleIdentifier account:@"username"];

4、UIPasteboard 剪切板

  • 顾名思义,UIPasteboard 是剪切板功能,因为 iOS 的原生控件 UITextField、UITextView、UIWebView,我们在使用时如果长按,就会出现复制、剪切、选中、全选、粘贴等功能,这个就是利用了系统剪切板功能来实现的。而每一个 App 都可以去访问系统剪切板,所以就能够通过系统剪贴板进行 App 间的数据传输了。

  • UIPasteboard 的使用很简单。

    	// 创建系统级剪切板
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; // 忘系统剪切板中写入淘宝口令
    pasteboard.string = @"复制这条信息,打开 手机淘宝 即可看到【天猫 天天搞机】¥ AAJOjvII ¥"; // 淘宝 App 从后台切换到前台时,从系统剪切板中读取淘宝口令进行显示
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"淘宝口令"
    message:pasteboard.string
    delegate:nil
    cancelButtonTitle:@"取消"
    otherButtonTitles:nil];
    [alert show];
  • UIPasteboard 典型的使用场景就是淘宝跟微信、QQ 的链接分享。由于腾讯和阿里的公司战略,腾讯在微信和 QQ 中都屏蔽了淘宝的链接。那如果淘宝用户想通过 QQ 或者微信跟好友分享某个淘宝商品,怎么办呢?阿里的工程师就巧妙的利用剪贴板实现了这个功能。首先淘宝 App 中将链接自定义成淘口令,引导用户进行复制,并去 QQ 好友对话中粘贴。然后 QQ 好友收到消息后再打开自己的淘宝 App,淘宝 App 每次从后台切到前台时,就会检查系统剪切板中是否有淘口令,如果有淘口令就进行解析并跳转到对于的商品页面。

  • 先复制淘口令到剪切板。

  • 再把剪切板中的内容粘贴到微信发给微信好友。

  • 微信好友把淘口令复制到淘宝中,就可以打开好友分享的淘宝链接了。

5、UIDocumentInteractionController 文档共享

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

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

    	NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
    
    	if (URL) {
    
    	    // 初始化
    self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL]; // 设置代理
    self.documentInteractionController.delegate = self; // 显示窗口预览 pdf
    [self.documentInteractionController presentPreviewAnimated:YES];
    }
  • 效果如下

6、local socket 本地 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 - App 间的通信方式的更多相关文章

  1. iOS - App 应用

    1.Xcode 项目属性 Product Name 软件名称.产品名称.项目名称 Organization Name 公司名称.组织名称 Organization Identifier 公司的唯一标识 ...

  2. iOS (APP)进程间8中常用通信方式总结

    1 URL Scheme 2 Keychain 3 UIPasteboard 4 UIDocumentInteractionController 5 local socket 6 AirDrop 7 ...

  3. iOS - App 与外设间的通信方式

    1.前言 一般 iOS 开发者做 App 开发大部分时候都是通过 Http(s) 请求跟后台服务器打交道,做一些信息展示和用户交互.很少涉及到去跟外部硬件设备连接的开发.随着近年来车联网和物联网的兴起 ...

  4. iOS App之间常用的五种通信方式及适用场景总结

    iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不能随意跨越自己的沙盒去访问 ...

  5. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  6. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  7. IOS App动态更新

    框架 JSPatch WaxPatch react-native   方案对比 目前已经有一些方案可以实现动态打补丁,例如WaxPatch,可以用Lua调用OC方法,相对于WaxPatch,JSPat ...

  8. 用Xamarin和Visual Studio编写iOS App

    一说开发 iOS app,你立马就会想到苹果的开发语言 Objective C/Swift 和 Xcode.但是,这并不是唯一的选择,我们完全可以使用别的语言和框架. 一种主流的替换方案是 Xamar ...

  9. 【译】UI设计基础(UI Design Basics)--iOS应用解析(iOS App Anatomy)(三)

    2.1  iOS应用解析(iOS App Anatomy) 几乎所有的iOS应用都会用到UIKit框架中的组件.了解这些基础组件的名称,角色,功能可以帮你在应用界面设计时做出更好的决策. UIKit提 ...

随机推荐

  1. @Java类加载的过程

    前言 我们写的源程序.java文件经过编译后成为了.class字节码文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机(JVM)之后才能运行和使用.而虚拟机如何加载这些.class文件 ...

  2. 第七章 常用Java集合类总结

    7.1.List(允许重复元素) ArrayList: 底层数据结构:Object[] 在查询(get).遍历(iterator).修改(set)使用的比较多的情况下,用ArrayList 可扩容,容 ...

  3. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  4. 总结div里面水平垂直居中的实现方法

    最近经常碰到要垂直居中的问题,所以想着总结一下:关于如何设置小盒子在大盒子里面水平垂直方向同时居中的实现方法有很多种,下面仅列举了常用的几种. 首先看一下要实现的效果图及对应的html代码: < ...

  5. Splunk的安装与使用

    一.简单介绍         Splunk 是机器数据的引擎.使用 Splunk 可收集.索引和利用全部应用程序.server和设备(物理.虚拟和云中)生成的高速移动型计算机数据 .从一个位置搜索并分 ...

  6. Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

  7. ECMAScript5之Object学习笔记(一)

    随着IE的逐步追赶,目前到IE11已经能够很好的支持ECMAScript5标准了,其他的现代浏览器像firefox,chrome,opera就更不用说了. 再加上nodejs使得javascript在 ...

  8. Android 四大组件之 Activity(一)

    1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...

  9. 第一节,学习cocos2d-x的前期准备

    1,我用的mac系统,在mac系统上装上cocos2d-x的模板 2,用doxygen工具装上API,这个非常重要,没有API的开发不叫开发,因此我们要习惯看API 3,知道怎么查看cocos2d-x ...

  10. URAL 题目1297. Palindrome(后缀数组+RMQ求最长回文子串)

    1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...