URL Schemes并不僅僅只是讓你跳轉(zhuǎn)一下
蘋果選擇沙盒來保障用戶的隱私和安全,但沙盒也阻礙了應(yīng)用間合理的信息共享,于是有了URL Schemes。使用過第三方支付,分享等功能的同學(xué)對于URL Schemes都不陌生,使用它我們可以很方便的跳轉(zhuǎn)到第三方APP來使用它們的很多功能。
如果想要深入了解的同學(xué)可以看一看官方文檔,或者網(wǎng)上的大神闡述的他們眼中的URL Schemes。
1.A程序跳轉(zhuǎn)B程序:
從本APP跳轉(zhuǎn)到第三方APP僅僅只需要三步:
首先、在B程序中添加自己的URL Schemes

然后在Info.plist文件中添加LSApplicationQueriesSchemes屬性并設(shè)置為Array,然后再其中添加你要跳轉(zhuǎn)APP的URL Schemes白名單

最后代碼中添加一個跳轉(zhuǎn)按鈕,在按鈕方法里添加跳轉(zhuǎn)即可:
NSURL *otherAppUrl = [NSURL URLWithString:@"ceshi://"];
//判斷當(dāng)前系統(tǒng)是否有安裝第三方app客戶端
if([[UIApplication sharedApplication] canOpenURL:otherAppUrl]){
[[UIApplication sharedApplication] openURL:otherAppUrl];
}else{
//打開一個網(wǎng)頁
NSURL *myUrl = [NSURL URLWithString:@"https://www.baidu.com/"];
[[UIApplication sharedApplication] openURL:myUrl];
}
2.AB程序互相跳轉(zhuǎn)
基于A程序跳轉(zhuǎn)B程序的基礎(chǔ)上,我們僅需在A程序中先設(shè)置好自己的URL Schemes,然后再B程序的Info.plist文件中配置A的URL Schemes白名單,然后再添加Action其中只需要修改代碼中的跳轉(zhuǎn)url即可。
3.A程序跳轉(zhuǎn)B程序,B程序在不知道A的URL Schemes的情況下返回A程序
由于任務(wù)需要,公司內(nèi)部APP需要相互調(diào)用,其中主程序ZH需要給其他授權(quán),于是ZH的URL Schemes開放出來,其他APP都可以調(diào)用。
這時(shí)問題來了,作為主程序的ZH不可能因?yàn)橥蝗欢嘁粋€APP需要授權(quán)了,ZH的Info.plist文件中又得添加一個URL Schemes的白名單。同時(shí)Info.plist文件在程序中是只讀屬性沒有辦法更改,不知道有沒有黑科技,官方文檔中有介紹。
但是微信第三方登陸,都是可以在授權(quán)登陸以后,還能返回原來APP的。
于是我們可以在其他程序跳轉(zhuǎn)ZH時(shí),將本APP的URL Schemes通過NSURL傳遞到ZH中,在ZH需要返回到原來APP的時(shí)候,在Action里我們通過訪問網(wǎng)頁來作為中間件訪問,調(diào)用openURL即可。
NSURL *otherAppUrl = [NSURL URLWithString:@"ceshi://"];
//打開一個網(wǎng)頁
NSURL *myUrl = [NSURL URLWithString:@"https://www.baidu.com/"];
[[UIApplication sharedApplication] openURL:myUrl];
然而讓人不能理解的是,在調(diào)用微信的時(shí)候,我們的APP并沒有設(shè)置URL Schemes,微信居然還能返回,估計(jì)是用的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"];