通过URLSchemes建立应用间通信机制(例:支付宝)

导语

大家都知道,应用间无法直接通信,所以即使是同公司的应用也无法直接在设备端直接通信和共享数据。
但是通过URLSchemes可以调起其它应用,他的官方格式为”标识符://”,这个标识符就是你给应用定义的URLSchemes,在”//”后面,可以通过类似于http链接的参数传递方式来在应用间传递少量数据进行交互,话不多说,撸代码。

 

1.建立两个应用并互相调用

1.1 首先建立应用bradley和johnson,bradley是我们的被调用应用,johnson则是我们的主动调用应用。

11544169-ad4ee8ec43635e93

建立应用

1.2 在bradley应用中找到TARGETS-Info-URL Types,新增一项,将其URL Schemes填写为bradley,同理也在johnson应用中找到TARGETS-Info-URL Types,新增一项,将其URL Schemes填写为johnson。

12544169-06d5fae0f3f7525e

bradley应用
13544169-f9017ae4610bb39e

johnson应用

1.3 在bradley的AppDelegate.m中添加如下方法及语句:

14544169-246ed43fc241915e

调起App回调方法

1.4 在johnson的主界面我们添加一个按钮,并执行跳转代码,但是为了严谨(参照微信支付),我们必须判断当前设备是否安装目标App,所以我们需要在info.plist文件中添加URL Schemes白名单:

15544169-b83d6d79d0fe8da7

URL Schemes白名单

只需将绿色框框内的信息加入即可。
跳转代码如下:

16544169-189c7c95a81c911b

跳转代码

1.5 运行调试,我们先运行bradley应用,再运行johnson应用,在johnson应用中点击按钮调起bradley应用,查看log信息:

17544169-3d7ca1a75db15b92

log信息

很明显我们成功的在johnson中调起了bradley应用,并打印出了日志,可以看到我们通过打开一个”bradley://”的url即可调起bradley应用。
那么我们可以在safari中调起bradley么?
答案是可以的:

18544169-f83b772be4c26c57

输入braley://
19544169-598d36fd20bb9fb1

询问打开
20544169-7f9bb60a8cc73731

log日志

所以在某种程度上,我们并不能阻止别人打开我们的应用,只能尽量避免自己应用URL Schemes的泄露,并在回调方法中做出一些判断取舍。

 

2.应用间的信息传递

2.1 大家都上过网,都知道上网需要网址,如:
https://ww.baidu.com?ceo=liyanhong&yewu=kengqian
在这里,”https://” 就类似于我们的标识符”bradley://”,我们通过在”//”后面加键值对来传递我们的参数,以达到应用间信息传递的目的。
下面我们来尝试传递一下几个参数:

21544169-dc522a955903b47c

参数传递

可见我们成功的将参数传递了过来,通过一些简单字符串处理我们就能组装成完整的参数字典。那么问题又来了,这个参数字符串能够经受的最大长度是多少呢?
起码1K的length是经得起的:

22544169-68337f302ade7c11

1000字符串传递
23544169-14caac07cbad4467

1000字符串传递成功

而且即使到1W也是OK的,所以大家可以放心使用。

 

3.应用间的信息传递处理完成后并跳转回来

3.1 信息传递是为了处理,处理完成后总有个结果,并需要把结果回传回来,这就是支付宝和微信支付的处理逻辑。
如何回调回来呢?
答:被调起的应用并不知道调起它的应用的URL Schemes,所以我们需要把自身应用的URL Schemes也传递过去,由被调起应用处理完成,重新调回来并将处理结果作为参数回传回来。
如下:

24544169-9aa9abbbb0b9ba92

johnson点击传递参数
25544169-65bab097a19e2707

bradley模拟处理后并回调
26544169-bd35d0f87d728cfe

bradley打印log
27544169-7c7f1342eba7fc09

johnson打印log

4.模拟支付宝案例(仅思路及简易代码)

小Demo链接

2 2 收藏 7 评论

关于作者:深发

一个乐于探索的技术人。 个人主页 · 我的文章 · 3

可能感兴趣的话题



直接登录
最新评论
  • 七秒小鱼人 iOS开发工程师 2016/11/03

    运行环境: Xcode8 +10.11.6
    运行报错:canOpenURL: failed for URL: “bradley://” – error: “This app is not allowed to query for scheme bradley”
    楼主知道这个是什么原因吗? 检查了一下代码没有错误,

    • 深发 iOS研发工程师 2016/11/03

      iOS10 上会出现这个错误,主要是因为openURL这个api也在iOS10上过时,现在openURL:options:CompletionHandler:取代

  • 请问博主,处理完数据后,返回原来的app,只知道跳转过来app的URL Schemes,如果不加入白名单,是跳转不回去的。
    不知道支付宝类似的app是怎么做到的?

跳到底部
返回顶部