理論篇
什么是URL Scheme战授?
簡單的說,由于蘋果選擇沙盒來保障用戶的隱私和安全桨嫁,App只能訪問自己的沙盒植兰,但同時(shí)也阻礙了應(yīng)用間合理的信息共享。所以蘋果提供了一個(gè)可以在App之間跳轉(zhuǎn)的方法:URL Scheme璃吧。如果你的App需要提供一個(gè)供別的App訪問的功能或者數(shù)據(jù)楣导,那么你必須在你的App定義一個(gè)相對應(yīng)的URL Scheme。當(dāng)別的App使用一個(gè)URL Scheme進(jìn)行訪問時(shí)畜挨,系統(tǒng)會(huì)根據(jù)URL Scheme進(jìn)行匹配筒繁,執(zhí)行相應(yīng)的操作噩凹。
如何理解URL Scheme?
為了更加深入的理解上面的那段話毡咏,首先我們清楚幾個(gè)概念:
1.URL(Uniform Resoure Locator:統(tǒng)一資源定位器):也就是我們熟悉的那個(gè)“網(wǎng)址”驮宴,通過他我們可以訪問到我們想要的服務(wù)和資源,并且URL可以傳遞相應(yīng)的參數(shù)呕缭;
2.URL地址格式排列為:scheme://host:port/path堵泽,舉個(gè)??,http://www.sohu.com/domain/HXWZ就是一個(gè)典型的URL恢总,而這個(gè)網(wǎng)址對應(yīng)的Scheme就是http迎罗,表示的是一個(gè) URL 中的一個(gè)位置——最初始的位置。也可以理解為一種自定義的協(xié)議片仿。
3.根據(jù)我們上面對 URL Scheme 的理解纹安,我們可以很輕易地理解,在以本地應(yīng)用為主的 iOS 上滋戳,我們可以像定位一個(gè)網(wǎng)頁一樣钻蔑,用一種特殊的 URL 來定位一個(gè)應(yīng)用甚至應(yīng)用里某個(gè)具體的功能。而定位這個(gè)應(yīng)用的標(biāo)識(shí)奸鸯,也就是Scheme。比如微信的Scheme是weixin,打開微信掃一掃功能的URL Scheme則是weixin://dl/scan可帽。
這樣一對比就容易很明白的理解出了URL Scheme的真正含義娄涩,它是為了在iOS系統(tǒng)中定位對應(yīng)的App然后執(zhí)行對應(yīng)的操作,復(fù)雜的URL Scheme還可以傳遞參數(shù)映跟。
URL Scheme的應(yīng)用場景蓄拣?
1.使用iOS系統(tǒng)預(yù)設(shè)的URL Scheme調(diào)用系統(tǒng)App:
iOS系統(tǒng)內(nèi)置的App,如mail努隙,電話等等球恤,都有相應(yīng)的URL Scheme供其他的App調(diào)用.比如下面的代碼就是使用系統(tǒng)的電話App給18888888888打電話。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18888888888"]];
關(guān)于其他系統(tǒng)支持的URL Scheme我在此不再贅述荸镊。以下是一些Scheme合集:
常用 iOS URL Scheme附錄
你所知道好玩有趣的 iOS URL schemes 有哪些
2.使用URL Scheme讓別的應(yīng)用打開自己的App,自己的App寫好一些需要?jiǎng)e的App來使用的功能咽斧。比如對于支付寶來說,當(dāng)?shù)腁pp使用支付寶支付功能時(shí)躬存,那么這些App就可以使用支付寶定義好的Scheme來訪問支付寶的支付功能张惹。
3.使用第三方App寫好的URL Scheme實(shí)現(xiàn)一些快捷功能。比如說我是一個(gè)工具類App岭洲,如果我知道很多App的Scheme宛逗,可以直接調(diào)用他們的很多功能,實(shí)現(xiàn)功能聚合的目的盾剩。事實(shí)上來說雷激,Launch Center Pro 就是基于Scheme來實(shí)現(xiàn)快捷方式的替蔬。
4.跨App間的一些交互
這個(gè)其實(shí)與第二條類似,但是分開說是因?yàn)?假如你們公司有2個(gè)以上的App或者你自己開發(fā)的多款A(yù)pp屎暇,要進(jìn)行進(jìn)程間的數(shù)據(jù)共享或者其他操作承桥,完全可以使用URL Scheme進(jìn)行一些具有想象力的操作。
5.進(jìn)行App間的跳轉(zhuǎn)恭垦。在傳統(tǒng)意義上的頁面跳轉(zhuǎn)快毛,無非也就是以下幾種方式:
Storyboard的segues方式跳轉(zhuǎn)
直接跳轉(zhuǎn)present,dismiss跳轉(zhuǎn)
UINavigationController的push番挺,pop跳轉(zhuǎn)
這些方式其實(shí)都有一個(gè)缺點(diǎn)唠帝,那就是跳轉(zhuǎn)很不靈活,如果想讓一個(gè)模塊根據(jù)需求動(dòng)態(tài)的跳轉(zhuǎn)不同頁面玄柏,傳遞不同的參數(shù)襟衰,那么就必須書寫很多復(fù)雜的邏輯幾句一些情況也選擇要跳轉(zhuǎn)的邏輯。
或許你說我可以通過控制器的名字來創(chuàng)建對應(yīng)的控制器進(jìn)行動(dòng)態(tài)的跳轉(zhuǎn)粪摘,但事實(shí)上這樣的方式如果僅僅進(jìn)行跳轉(zhuǎn)還是能滿足需求的瀑晒,但是在傳遞參數(shù)方面就是閑的力不從心。
所以說了那么多徘意,有一種跳轉(zhuǎn)方式可以既滿足跳轉(zhuǎn)的動(dòng)態(tài)需求苔悦,也可以靈活的傳遞參數(shù)。這種方式就是使用URL Scheme進(jìn)行動(dòng)態(tài)跳轉(zhuǎn)椎咧。這也是我非常推薦的一種使用方式玖详。并且在一些組件化開發(fā)的嘗試中,這種跳轉(zhuǎn)方式也帶來了很多便利勤讽。
使用URL Scheme跳轉(zhuǎn)的好處
1.這種跳轉(zhuǎn)方式是很靈活的蟋座,我本地只需要需要進(jìn)行簡單邏輯處理,使用openURL來打開對應(yīng)的控制器脚牍,而這個(gè)你想要打開的URL Scheme是可以動(dòng)態(tài)的從服務(wù)器動(dòng)態(tài)獲取的向臀。那么這樣就很簡單的實(shí)現(xiàn)了動(dòng)態(tài)跳轉(zhuǎn)。
2.URL Scheme傳遞參數(shù)的方式也與URL一致诸狭,只需要簡單的在URL里附加上對應(yīng)的參數(shù)即可券膀。
3.這種頁面跳轉(zhuǎn)是無差別的,通過URL Scheme跳轉(zhuǎn)可以無縫的在H5頁面和原生頁面之間跳轉(zhuǎn)傳值作谚,而無非做更多的邏輯判斷三娩。
使用URL Scheme跳轉(zhuǎn)的缺點(diǎn)
1.寫在info.plist文件中的Scheme可能會(huì)被一些反編譯手段獲取到。
2.URL Scheme可能會(huì)被劫持調(diào)來安全隱患妹懒,比如支付寶的URL Scheme劫持漏洞
當(dāng)然這是避免的,以下引自烏云:
蘋果可以限制 iOS 應(yīng)用不能注冊別的應(yīng)用的 Bundle ID 作為 URL Scheme雀监。這樣的話,使用自己的 Bundle ID 作為 URL Scheme 的接收器就會(huì)變的安全很多。
第三方應(yīng)用可以通過
①給自己發(fā)送 URL Scheme 請求來證明沒有被劫持会前,如果沒有收到自己的 URL Scheme好乐,就可以及時(shí)給用戶發(fā)送提醒;
②利用 MobileCoreServices 服務(wù)中的 applicationsAvailableForHandlingURLScheme() 來查看所有注冊了該 URL Schemes 的應(yīng)用和處理順序瓦宜,從而檢測自己蔚万、或者別人的 URL Scheme 是否被劫持。
作者:Job_Yang
鏈接:http://www.reibang.com/p/d3185c70cc44
來源:簡書
著作權(quán)歸作者所有临庇。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)反璃,非商業(yè)轉(zhuǎn)載請注明出處。