URL Schemes并不仅仅只是让你跳转一下
苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了URL Schemes。使用过第三方支付,分享等功能的同学对于URL Schemes都不陌生,使用它我们可以很方便的跳转到第三方APP来使用它们的很多功能。
如果想要深入了解的同学可以看一看官方文档,或者网上的大神阐述的他们眼中的URL Schemes。
1.A程序跳转B程序:
从本APP跳转到第三方APP仅仅只需要三步:
首先、在B程序中添加自己的URL Schemes
然后在Info.plist文件中添加LSApplicationQueriesSchemes属性并设置为Array,然后再其中添加你要跳转APP的URL Schemes白名单
最后代码中添加一个跳转按钮,在按钮方法里添加跳转即可:
NSURL *otherAppUrl = [NSURL URLWithString:@"ceshi://"];
//判断当前系统是否有安装第三方app客户端
if([[UIApplication sharedApplication] canOpenURL:otherAppUrl]){
[[UIApplication sharedApplication] openURL:otherAppUrl];
}else{
//打开一个网页
NSURL *myUrl = [NSURL URLWithString:@"https://www.baidu.com/"];
[[UIApplication sharedApplication] openURL:myUrl];
}
2.AB程序互相跳转
基于A程序跳转B程序的基础上,我们仅需在A程序中先设置好自己的URL Schemes,然后再B程序的Info.plist文件中配置A的URL Schemes白名单,然后再添加Action其中只需要修改代码中的跳转url即可。
3.A程序跳转B程序,B程序在不知道A的URL Schemes的情况下返回A程序
由于任务需要,公司内部APP需要相互调用,其中主程序ZH需要给其他授权,于是ZH的URL Schemes开放出来,其他APP都可以调用。
这时问题来了,作为主程序的ZH不可能因为突然多一个APP需要授权了,ZH的Info.plist文件中又得添加一个URL Schemes的白名单。同时Info.plist文件在程序中是只读属性没有办法更改,不知道有没有黑科技,官方文档中有介绍。
但是微信第三方登陆,都是可以在授权登陆以后,还能返回原来APP的。
于是我们可以在其他程序跳转ZH时,将本APP的URL Schemes通过NSURL传递到ZH中,在ZH需要返回到原来APP的时候,在Action里我们通过访问网页来作为中间件访问,调用openURL即可。
NSURL *otherAppUrl = [NSURL URLWithString:@"ceshi://"];
//打开一个网页
NSURL *myUrl = [NSURL URLWithString:@"https://www.baidu.com/"];
[[UIApplication sharedApplication] openURL:myUrl];
然而让人不能理解的是,在调用微信的时候,我们的APP并没有设置URL Schemes,微信居然还能返回,估计是用的BundleID打开的APP,哦,上帝,万能的Runtime!来吧,代码!
头文件引入:#import <objc/runtime.h>
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
NSObject * workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
BOOL isopen = [workspace performSelector:@selector(openApplicationWithBundleID:) withObject:@"bangyongli.pedometer"];