iOS URL Scheme

前言

由于“沙盒”機(jī)制的存在署惯,iOS系統(tǒng)中的app都處于一個(gè)相對(duì)封閉的環(huán)境中,app之間的不管是合理還是不合理的信息共享基本都被阻隔掉了熄驼,當(dāng)然蘋果這樣做的目地也很簡(jiǎn)單蛤售,就是為了保護(hù)用戶的隱私和安全(這也是現(xiàn)在互聯(lián)網(wǎng)存在的一個(gè)很重要問題,畢竟已經(jīng)爆出了各種門了)喂江。那么app之間想要跳轉(zhuǎn)或者做一些基本的信息傳遞該怎么辦呢召锈?那么就用到了文章的主題URL Scheme

URLScheme是啥

網(wǎng)址相信大家都很了解了获询,其實(shí)URL Scheme跟網(wǎng)址差不多的涨岁,很類似,URL Scheme拆分開就兩個(gè)單詞:

  • URL(Uniform Resoure Locator:統(tǒng)一資源定位器) 也就是我們常說(shuō)的鏈接或者網(wǎng)址
  • Scheme 一般一個(gè)網(wǎng)址的格式是scheme://host:port/path吉嚣,而scheme表示URL的第一個(gè)位置---最初開始的位置

在iOS 系統(tǒng)中梢薪,安裝了一個(gè)app后,如果這個(gè)app有URL Scheme的話尝哆,安裝完成后會(huì)在系統(tǒng)中注冊(cè)該URL Scheme秉撇,這樣別的app或者瀏覽器就可以通過(guò)該到URL Scheme定位該app,當(dāng)然定位到app只是URL Scheme最基本的功能。

URL Scheme的使用方式

1.最簡(jiǎn)單也是最基礎(chǔ)的作用就是從別的app或者瀏覽器中打開自己的app琐馆,當(dāng)然單純打開肯定是沒啥意義的规阀,但是這個(gè)也是下面功能的基礎(chǔ)。

2.在URL Scheme后面拼接參數(shù)實(shí)現(xiàn)業(yè)務(wù)功能瘦麸,例如系統(tǒng)的app也有URL Scheme谁撼,使用代碼tel://18788888888就可以彈出彈框提示是否需要撥打電話,常用的系統(tǒng)URL Scheme滋饲,還有一些第三方的URL Scheme厉碟,不過(guò)第三方的URL Scheme都只是基本的Scheme,具體的功能參數(shù)拼接就需要查看官方文檔或者直接使用第三方的SDK了屠缭。

這里還說(shuō)個(gè)事就是蘋果針對(duì)URL Scheme沒有提出不能使用重復(fù)scheme的說(shuō)明箍鼓,所以一些app就在自己app里面使用一些app一樣的scheme以達(dá)到攔截URL Scheme的問題,可以看看URL Scheme攔截呵曹。

以上是URL Scheme常用的方式袄秩,你也可以使用的更復(fù)雜點(diǎn),可以參考URL Scheme從入門到精通

URL Scheme的用法

說(shuō)了這么多逢并,那app里面怎么添加自己的URL Scheme呢?其實(shí)很簡(jiǎn)單:


自定義URL Scheme添加步驟

添加完也直接反應(yīng)到配置文件info.plist中了郭卫,當(dāng)然你要是覺得自己很厲害砍聊,也可以直接在info.plist文件里面加(恩!你是最棒的贰军!)


配置URL Scheme成功后的info.plist

自己app的URL Scheme添加好了玻蝌,別的app怎么使用呢?也很簡(jiǎn)單

[[UIApplication sharedApplication] openURL:[NSURL URLWithSting:@"***://***"]]词疼;

當(dāng)然如果沒安裝該app的話俯树,這個(gè)代碼也是無(wú)效了,用戶啥效果都看不到贰盗,所以為了更友好的交互呢许饿,可以在外層添加判斷

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"***://***"]])
    {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"***://***"]];
    }else{
        //提示用戶未安裝app
    }

別的app利用URL Scheme打開自己的app的動(dòng)作該怎么撲捉呢?在app被URL Scheme打開的時(shí)候會(huì)觸發(fā)如下代理方法舵盈,使用的版本要求也都在下面了陋率。(建議把對(duì)URL Scheme的處理封裝出來(lái),減少AppDelegate的代碼量)

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason

但是我一直有個(gè)疑問這幾個(gè)代理方法都有一個(gè)BOOL返回值秽晚,這個(gè)返回值的作用是啥瓦糟?return NO if the application can't open for some reason雖然這里有一個(gè)備注,但是我不管返回的YES/NO赴蝇,app都會(huì)打開的(有人要是知道還望指教)菩浙。

至此URL Scheme的使用基本完成了,但是程序員的腦袋是聰明的,有些程序員可以再代碼里面遍歷他知道的所有第三方URL Scheme劲蜻,并利用[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"***://***"]]知道用戶有沒有安裝該第三方應(yīng)用陆淀,這樣就可以給用戶推送相應(yīng)的消息,例如通過(guò)有沒有安裝女性app知道用戶的性別斋竞,然后可以給用戶推薦女性用戶的消息倔约,這個(gè)明顯窺探了用戶的隱私了,所以iOS 9后蘋果為URL Scheme添加了白名單坝初,開發(fā)者需要在白名單中注冊(cè)自己app要用到的URL Scheme浸剩,而白名單是有數(shù)量限制的,最多50個(gè)鳄袍,在iOS 9中不在白名單中注冊(cè)的話绢要,利用URL Scheme是打不開其他app的,而且在控制臺(tái)還會(huì)打印如下錯(cuò)誤信息拗小,錯(cuò)誤信息也說(shuō)的很清楚了

2017-02-10 15:41:56.011 LYURLSchemeAPPA[1870:174154] -canOpenURL: failed for URL: "appb://" - error: "This app is not allowed to query for scheme appb"
URL Scheme白名單

有時(shí)候就算在URL Scheme白名單中注冊(cè)了還是會(huì)打印類似于下面的日志重罪,只不過(guò)error后面是null,網(wǎng)上說(shuō)這個(gè)是模擬器的bug哀九,換成真機(jī)就可以了剿配,但是我試了,的確會(huì)少一部分日志但是還是存在的一部分阅束,也不知道是為啥呼胚。

2017-02-10 11:32:35.196 LQEachOnlineManager[1541:77944] -canOpenURL: failed for URL: "mqq://" - error: "(null)"

番外

如何找到第三方app的URL Scheme呢?
1.在itunes下載一個(gè)該應(yīng)用的安裝包
2.利用在finder中顯示在文件夾中找到找到安裝包息裸,拷貝到桌面蝇更,修改后綴名為.zip,解壓文件
3.打開payload->***.app->顯示包內(nèi)容呼盆,查找info.plist年扩,這個(gè)就跟自己app的info.plist一樣了,app注冊(cè)了哪些自定義的URL Scheme就一目了然了
這個(gè)也算是URL Scheme的缺點(diǎn)吧访圃!

遺留問題

1.代理方法BOOL返回值的作用

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason

相關(guān)文章

1.URLScheme 使用說(shuō)明
2.URL Scheme從入門到精通
3.[iOS開發(fā)]打開另一個(gè)APP(URL Scheme與openURL)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厨幻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腿时,更是在濱河造成了極大的恐慌克胳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圈匆,死亡現(xiàn)場(chǎng)離奇詭異漠另,居然都是意外死亡控汉,警方通過(guò)查閱死者的電腦和手機(jī)岩灭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玄柏,“玉大人,你說(shuō)我怎么就攤上這事满败》羝担” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵算墨,是天一觀的道長(zhǎng)宵荒。 經(jīng)常有香客問我,道長(zhǎng)净嘀,這世上最難降的妖魔是什么报咳? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮挖藏,結(jié)果婚禮上暑刃,老公的妹妹穿的比我還像新娘。我一直安慰自己膜眠,他們只是感情好岩臣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宵膨,像睡著了一般架谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辟躏,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天谷扣,我揣著相機(jī)與錄音,去河邊找鬼鸿脓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涯曲,可吹牛的內(nèi)容都是我干的野哭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼幻件,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拨黔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绰沥,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤篱蝇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徽曲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體零截,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年秃臣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涧衙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪工。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弧哎,靈堂內(nèi)的尸體忽然破棺而出雁比,到底是詐尸還是另有隱情,我是刑警寧澤撤嫩,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布偎捎,位于F島的核電站,受9級(jí)特大地震影響序攘,放射性物質(zhì)發(fā)生泄漏茴她。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一两踏、第九天 我趴在偏房一處隱蔽的房頂上張望败京。 院中可真熱鬧,春花似錦梦染、人聲如沸赡麦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泛粹。三九已至,卻和暖如春肮疗,著一層夾襖步出監(jiān)牢的瞬間晶姊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工伪货, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留们衙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓碱呼,卻偏偏與公主長(zhǎng)得像蒙挑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愚臀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容