iOS 支持從一個(gè) App 跳轉(zhuǎn)到另一個(gè) App宅倒,這其中的原理就是 URL SCheme躏啰。這一功能特別炫酷卓嫂,當(dāng)你在 iphone 上使用 Safari 瀏覽器時(shí)榔昔,通過輸入正確的 url 喚起對應(yīng)的 app,你也可以在某個(gè) App 內(nèi)直接跳轉(zhuǎn)到另外一個(gè) App定硝。雖然 iOS 系統(tǒng)的沙盒機(jī)制阻擋了不同 App 之間的交流皿桑,但是 URL Scheme 這一特性卻又允許開發(fā)者實(shí)現(xiàn)不同 App 間的通信。
系統(tǒng) URL Scheme
系統(tǒng)已經(jīng)給開發(fā)者提供了幾個(gè)系統(tǒng) App 對應(yīng)的 URL Scheme蔬啡,從官方文檔中可以找到這幾種通用 URL SCheme 的調(diào)用方式诲侮。這些功能包括打電話、發(fā)郵件箱蟆、發(fā)短信等等沟绪。
發(fā)郵件
// html
<a href="mailto:frank@wwdcdemo.example.com">John Frank</a>
// objective-c
mailto:frank@wwdcdemo.example.com
// 包含主題、消息空猜、發(fā)件人等信息
mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!
注:如果沒有安裝郵件類 App绽慈,系統(tǒng)會(huì)給出一個(gè)錯(cuò)誤提示。
打電話
// html
<a href="tel:1-408-555-5555">1-408-555-5555</a>
// objective-c
tel:1-408-555-5555
注:如果是在 web 頁面點(diǎn)擊一個(gè)電話鏈接辈毯,系統(tǒng)會(huì)彈出提示框坝疼,但是 app 內(nèi)開發(fā)者打開一個(gè)打電話的鏈接,系統(tǒng)不會(huì)彈出提示框谆沃,但是希望 native 通過 Alert
的方式提示用戶钝凶。
發(fā)短信
// html
<a href="sms:">Launch Messages App</a>
<a href="sms:1-408-555-1212">New SMS Message</a>
// objective-c
sms:
sms:1-408-555-1212
地圖
地圖 scheme 用于展示地理位置信息或者生成兩點(diǎn)之間的駕駛導(dǎo)航,但是跟其他 scheme 不同管毙,系統(tǒng)地圖 app 的喚起是采用通用 http 格式的鏈接進(jìn)行啟動(dòng)的腿椎。同時(shí)需要注意桌硫,連接后面通過參數(shù)指定具體的功能夭咬。
// 參數(shù)類型
t:地圖視圖模式啃炸,m (標(biāo)準(zhǔn)視圖)、k (衛(wèi)星視圖)卓舵、h (混合視圖)南用、r (運(yùn)輸視圖)
q:查詢內(nèi)容
address:地址內(nèi)容
near:提示信息
ll:地圖中心的定位坐標(biāo)
z:縮放等級(jí)
spn:圍繞中心點(diǎn)的轉(zhuǎn)速
saddr:源地址
daddr:目的地地址
dirflg:傳輸類型
sll:搜索定位坐標(biāo)
sspn:屏幕的轉(zhuǎn)速
// link sample
http://maps.apple.com/?q=Mexican+Restaurant
打開 iTunes
用于鏈接到 iTunes 音樂商店
// html
<a >
<img height="15" width="61" alt="Randy Newman - Toy Story
- You've Got a Friend In Me" src="http://ax.phobos.apple.com.edgesuite.net/images/
badgeitunes61x15dark.gif"></img>
</a>
// native
http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=156093464&id=156093462&s=143441
第三方 URL Scheme
常用的 App 對應(yīng)的 URL Scheme 列舉如下,不過掏湾,下方列舉出的 URL Scheme
只是基本的 Scheme裹虫,如果想了解具體的功能及其參數(shù)就需要查看官方文檔或者直接使用第三方的SDK了。
淘寶寶貝搜索 taobao://[http://s.taobao.com/?q=xxx]
淘寶店鋪搜索 taobao://[http://shopsearch.taobao.com/browse/shop_search.htm?q=**]
QQ的url是 mqq://
微信是weixin://
淘寶taobao://
點(diǎn)評(píng)dianping:// dianping://search
微博 sinaweibo://
名片全能王camcard://weico
微博weico://
支付寶alipay://
豆瓣fm:doubanradio://
微盤 sinavdisk://
網(wǎng)易公開課ntesopen://
美團(tuán) imeituan://
京冬openapp.jdmoble://
人人renren://
我查查 wcc://
1號(hào)店wccbyihaodian://
有道詞典yddictproapp://
知乎zhihu://
優(yōu)酷 youku://
自定義 URL Scheme
給 iPhone 手機(jī)安裝 App 時(shí)融击,如果這個(gè) App 設(shè)置了 URL Scheme筑公,安裝完成后 iOS 系統(tǒng)會(huì)自動(dòng)注冊該 URL Scheme,這樣其他 App 或者瀏覽器就可以通過 URL 的方式找到對應(yīng)的 App 并喚起該 App尊浪。
除了喚起 App 這樣基本的功能外匣屡,不同 App 之間消息傳遞也經(jīng)常用該方案。像微信拇涤、微博分享捣作、微信、支付寶付款鹅士,等等券躁。
那么,看一下如何給一個(gè) App 自定義 URL Scheme掉盅。
其實(shí)很簡單:
這里也拜,我們設(shè)置了 URL Scheme 為 "fusion"。
但是這樣還沒完事趾痘,你只是注冊了當(dāng)前 App 的 Scheme慢哈,但是,應(yīng)用是否允許喚起還需要做一步操作扼脐,那就是監(jiān)聽喚起事件岸军。在 AppDelegate.m文件中,實(shí)現(xiàn)相應(yīng)的代理方法:
// return NO 則不允許喚起(實(shí)際不生效瓦侮,費(fèi)解)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options;
特別的艰赞,iOS9之后,新增了白名單概念肚吏。如果沒有在 info.plist 添加白名單方妖,則會(huì)有如下結(jié)果:
BOOL result = [[UIApplication sharedApplication] canOpenURL:url]; // result = NO;
同時(shí),控制臺(tái)打印類似下面的錯(cuò)誤提示信息:
-canOpenURL: failed for URL: "XXX://" - error: "This app is not allowed to query for scheme TestB"
解決這一問題很簡單罚攀,添加白名單即可党觅。
info.plist 里添加 key 為 LSApplicationQueriesSchemes 的字段雌澄,類型為 Array。依次填入 App 支持的第三方 app 的 scheme 即可杯瞻。
調(diào)用自定義 URL Scheme
繼續(xù)上面這個(gè)例子镐牺,我們看看如何通過 URL Scheme 喚起這個(gè) app。
一開始也提到了魁莉,要么通過 Safari 要么通過應(yīng)用內(nèi)跳轉(zhuǎn)睬涧,當(dāng)然,最簡單的方法就是前者了旗唁。
此時(shí)畦浓,Demo 客戶端就被喚起了。
那么检疫,通過其他 App 來喚起 fusion App 該如何做呢讶请?
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fusion://"]]){
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"fusion://"]];
} else {
//提示用戶未安裝app
}
先判斷系統(tǒng)是否安裝相應(yīng) Scheme 的 App,即是否注冊 Scheme屎媳,然后再打開對應(yīng)的 App夺溢。