很多时候我们需要从一个App跳转到另一个App完成操作,比如:在淘宝中下单购物,选择微信支付后跳转到微信完成支付。
通常我们使用URL Schemes来完成这个动作,首先进程给自己定义一些scheme,表示其它进程可以通过该scheme调用自己。这个scheme就相当于一个进程协议,比如进程A给自己定义的scheme为aaaa,那么其它应用可以通过 aaaa:自定义参数 这样的格式,使用openURL去调用进程A。
在Xcode中去设置CFBundleURLType,这个参数去添加当前App的scheme,一个App可以拥有多个scheme,通常我们做支付的时候会针对支付宝微信银联,定义该App不同scheme,去回调。
当然我们对于scheme的定义也不要过于简单,还有具有唯一性才好。如果两个进程定义了同一个scheme,为test,在另一个进程中调用test:xxxxx,这个时候不能同时调用两个进程,只能调用先安装到设备上的进程,另一个相同scheme的进程则不会被调用。
LSApplicationQueriesSchemes是从iOS9时被引入的,应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。这个参数表示当前APP允许访问的APP有哪些,即白名单,需要通信双方均设置为对方的scheme,否则当调用对方App时,系统会告诉你This app is not allowed to query for scheme。调用者和被调用者均需要设置白名单,一方想调用,另一方需要也知道将被你调用 ,更为安全。
但是我们实际使用一下,你会发现我们不需要在LSApplicationQueriesSchemes进行任何设置,只要知道App声明的scheme就可以执行openURL方法调起这个App,这是怎么回事儿?
一般情况下,我们在调起一个APP的时候回检查是否安装,会调用canOpenURL,LSApplicationQueriesSchemes这个参数在这个时候起作用,如果URL不在白名单中,即使手机上安装了这个App,也会返回NO,不能调起。但你非要说你不做任何检查直接openUrl,那么白名单确实作用不大,没有对应scheme的App时,openURL方法执行无实际效果,但是用户体验不是很好。以上便是我对使用Scheme进行App间进程通信的认识,欢迎纠正和补充。