iOS URL Schemes和BundleID打開APP的正確姿勢

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

URL Schemes.png

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


Info.plist.png

最后代碼中添加一個跳轉(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"];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容