iOS URL Scheme 理論

理論篇

什么是URL Scheme?

簡單的說,由于蘋果選擇沙盒來保障用戶的隱私和安全,App只能訪問自己的沙盒,但同時也阻礙了應用間合理的信息共享。所以蘋果提供了一個可以在App之間跳轉的方法:URL Scheme。如果你的App需要提供一個供別的App訪問的功能或者數據,那么你必須在你的App定義一個相對應的URL Scheme。當別的App使用一個URL Scheme進行訪問時,系統(tǒng)會根據URL Scheme進行匹配,執(zhí)行相應的操作。

如何理解URL Scheme?

為了更加深入的理解上面的那段話,首先我們清楚幾個概念:

1.URL(Uniform Resoure Locator:統(tǒng)一資源定位器):也就是我們熟悉的那個“網址”,通過他我們可以訪問到我們想要的服務和資源,并且URL可以傳遞相應的參數;

2.URL地址格式排列為:scheme://host:port/path,舉個??,http://www.sohu.com/domain/HXWZ就是一個典型的URL,而這個網址對應的Scheme就是http,表示的是一個 URL 中的一個位置——最初始的位置。也可以理解為一種自定義的協(xié)議。

3.根據我們上面對 URL Scheme 的理解,我們可以很輕易地理解,在以本地應用為主的 iOS 上,我們可以像定位一個網頁一樣,用一種特殊的 URL 來定位一個應用甚至應用里某個具體的功能。而定位這個應用的標識,也就是Scheme。比如微信的Scheme是weixin,打開微信掃一掃功能的URL Scheme則是weixin://dl/scan

這樣一對比就容易很明白的理解出了URL Scheme的真正含義,它是為了在iOS系統(tǒng)中定位對應的App然后執(zhí)行對應的操作,復雜的URL Scheme還可以傳遞參數。

URL Scheme的應用場景?

1.使用iOS系統(tǒng)預設的URL Scheme調用系統(tǒng)App:
iOS系統(tǒng)內置的App,如mail,電話等等,都有相應的URL Scheme供其他的App調用.比如下面的代碼就是使用系統(tǒng)的電話App給18888888888打電話。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18888888888"]];
關于其他系統(tǒng)支持的URL Scheme我在此不再贅述。以下是一些Scheme合集:

常用 iOS URL Scheme附錄

你所知道好玩有趣的 iOS URL schemes 有哪些

2.使用URL Scheme讓別的應用打開自己的App,自己的App寫好一些需要別的App來使用的功能。比如對于支付寶來說,當的App使用支付寶支付功能時,那么這些App就可以使用支付寶定義好的Scheme來訪問支付寶的支付功能。

3.使用第三方App寫好的URL Scheme實現一些快捷功能。比如說我是一個工具類App,如果我知道很多App的Scheme,可以直接調用他們的很多功能,實現功能聚合的目的。事實上來說,Launch Center Pro 就是基于Scheme來實現快捷方式的。

4.跨App間的一些交互
這個其實與第二條類似,但是分開說是因為,假如你們公司有2個以上的App或者你自己開發(fā)的多款App,要進行進程間的數據共享或者其他操作,完全可以使用URL Scheme進行一些具有想象力的操作。

5.進行App間的跳轉。在傳統(tǒng)意義上的頁面跳轉,無非也就是以下幾種方式:

Storyboard的segues方式跳轉

直接跳轉present,dismiss跳轉

UINavigationController的push,pop跳轉

這些方式其實都有一個缺點,那就是跳轉很不靈活,如果想讓一個模塊根據需求動態(tài)的跳轉不同頁面,傳遞不同的參數,那么就必須書寫很多復雜的邏輯幾句一些情況也選擇要跳轉的邏輯。

或許你說我可以通過控制器的名字來創(chuàng)建對應的控制器進行動態(tài)的跳轉,但事實上這樣的方式如果僅僅進行跳轉還是能滿足需求的,但是在傳遞參數方面就是閑的力不從心。

所以說了那么多,有一種跳轉方式可以既滿足跳轉的動態(tài)需求,也可以靈活的傳遞參數。這種方式就是使用URL Scheme進行動態(tài)跳轉。這也是我非常推薦的一種使用方式。并且在一些組件化開發(fā)的嘗試中,這種跳轉方式也帶來了很多便利。

使用URL Scheme跳轉的好處

1.這種跳轉方式是很靈活的,我本地只需要需要進行簡單邏輯處理,使用openURL來打開對應的控制器,而這個你想要打開的URL Scheme是可以動態(tài)的從服務器動態(tài)獲取的。那么這樣就很簡單的實現了動態(tài)跳轉。

2.URL Scheme傳遞參數的方式也與URL一致,只需要簡單的在URL里附加上對應的參數即可。

3.這種頁面跳轉是無差別的,通過URL Scheme跳轉可以無縫的在H5頁面和原生頁面之間跳轉傳值,而無非做更多的邏輯判斷。

使用URL Scheme跳轉的缺點

1.寫在info.plist文件中的Scheme可能會被一些反編譯手段獲取到。

2.URL Scheme可能會被劫持調來安全隱患,比如支付寶的URL Scheme劫持漏洞

當然這是避免的,以下引自烏云:

蘋果可以限制 iOS 應用不能注冊別的應用的 Bundle ID 作為 URL Scheme。這樣的話,使用自己的 Bundle ID 作為 URL Scheme 的接收器就會變的安全很多。

第三方應用可以通過

①給自己發(fā)送 URL Scheme 請求來證明沒有被劫持,如果沒有收到自己的 URL Scheme,就可以及時給用戶發(fā)送提醒;

②利用 MobileCoreServices 服務中的 applicationsAvailableForHandlingURLScheme() 來查看所有注冊了該 URL Schemes 的應用和處理順序,從而檢測自己、或者別人的 URL Scheme 是否被劫持。

作者:Job_Yang
鏈接:http://m.itdecent.cn/p/d3185c70cc44
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容