前言
由于“沙盒”機(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)單:
添加完也直接反應(yīng)到配置文件info.plist中了郭卫,當(dāng)然你要是覺得自己很厲害砍聊,也可以直接在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"
有時(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)