網(wǎng)上也有講這塊的难礼,感覺講得都不是很好。而且有一些細(xì)節(jié)根本沒有講清楚玫锋。這里重寫整理一下相關(guān)知識點(diǎn)蛾茉。
主要內(nèi)容
- URL Scheme 是什么?
- 項(xiàng)目中關(guān)鍵的配置
- 注意事項(xiàng)
URL Scheme 是什么景醇?
iOS
有個(gè)特性就是應(yīng)用將其自身”綁定”到一個(gè)自定義 URL scheme
上臀稚,該 scheme
用于從瀏覽器或其他應(yīng)用中啟動(dòng)本應(yīng)用。常見的分享到第三方之間的跳轉(zhuǎn)都是基于Scheme
的三痰。
通過對比網(wǎng)頁鏈接來理解iOS
上的 URL Schemes
,應(yīng)該就容易多了窜管。
-
URL
散劫,我們都很清楚,http://www.apple.com
就是個(gè)URL
幕帆,我們也叫它鏈接或網(wǎng)址获搏; -
Schemes
,表示的是一個(gè)UR
L 中的一個(gè)位置——最初始的位置失乾,即://
之前的那段字符常熙。比如http://www.apple.com
這個(gè)網(wǎng)址的Schemes
是 http。
根據(jù)我們上面對URL Schemes
的使用碱茁,我們可以很輕易地理解裸卫,在以本地應(yīng)用為主的 iOS 上,我們可以像定位一個(gè)網(wǎng)頁一樣纽竣,用一種特殊的 URL
來定位一個(gè)應(yīng)用甚至應(yīng)用里某個(gè)具體的功能墓贿。而定位這個(gè)應(yīng)用的,就應(yīng)該這個(gè)應(yīng)用的URL 的 Schemes
部分蜓氨,也就是開頭兒那部分聋袋。比如短信,就是 sms:
你可以完全按照理解一個(gè)網(wǎng)頁的 URL ——也就是它的網(wǎng)址——的方式來理解一個(gè) iOS 應(yīng)用的 URL穴吹,拿蘋果的網(wǎng)站和 iOS 上的微信來做個(gè)簡單對比:
網(wǎng)頁(蘋果) | iOS 應(yīng)用(微信) | |
---|---|---|
網(wǎng)站首頁/打開應(yīng)用 | http://www.apple.com | weixin:// |
子頁面/具體功能 | http://www.apple.com/mac/(Mac頁面) | weixin://dl/moments(朋友圈) |
關(guān)于基礎(chǔ)概念性的就講這么多
項(xiàng)目中關(guān)鍵的配置
在項(xiàng)目Info
的Url Type
中配置(被喚起端)
Url Type
,表示可以被哪些帶前綴Url打開,而不是可以打開以這些前綴開頭的app幽勒。
- 說明
- URL identifier只是一個(gè)標(biāo)示符,隨意填寫港令,建議寫成:
com.*.*
反轉(zhuǎn)域名的方法保證該名字的唯一性啥容。 - URL Scheme就是你用來通信的命令前綴,用來定位一個(gè)應(yīng)用棘钞。
- URL identifier只是一個(gè)標(biāo)示符,隨意填寫港令,建議寫成:
在Plist
文件中配置
- 注意:
URL Schemes
是一個(gè)數(shù)組,允許應(yīng)用定義多個(gè)URL schemes
干毅。
接收到喚起如何處理
在代理方法- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
中判斷喚起的來源source app
,根據(jù)Url
所攜帶的參數(shù)進(jìn)行不同的操作宜猜。比如跳轉(zhuǎn)到制定的頁面,相關(guān)的邏輯處理等等.
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSLog(@"Calling Application Bundle ID: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
// Customer Code
return YES;
}
以上配置是在被喚起應(yīng)用中配置的硝逢。
喚起端
一般情況下姨拥,喚起端可以直接調(diào)用appDelegate
的代理方法去喚醒其他應(yīng)用。
- (void)awakeOtherApp
{
NSString *customURL = @"otherApp://";
if ([[UIApplication sharedApplication]
canOpenURL:[NSURL URLWithString:customURL]])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"
message:[NSString stringWithFormat:
@"No custom URL defined for %@", customURL]
delegate:self cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
}
- 這里需要注意一下在
iOS9
以后渠鸽,喚起端需要配置一下
LSApplicationQueriesSchemes
.iOS9
之后需要叫乌,iOS9
之后提高了app
的安全性,需要給出一個(gè)類似白名單的東西徽缚,在白名單里面的才能打開app
憨奸。不然報(bào)錯(cuò):** -canOpenURL: failed for URL: "OpenAppTest://mark?id=007" - error: "This app is not allowed to query for scheme OpenAppTest"**
注意事項(xiàng)
通過上面的方法可以喚醒其他的應(yīng)用,簡單總結(jié)下一些注意事項(xiàng)凿试。
- URL Scheme 其實(shí)就是一個(gè)app應(yīng)用的唯一標(biāo)志排宰。通過它來確定打開那個(gè)應(yīng)用。
- 一定要分清哪些配置在哪方配置那婉,被喚醒與喚醒板甘。
- iOS9之后需要在喚起端加入
LSApplicationQueriesSchemes
千萬不能忘。 - 還有一個(gè)問題還沒解決详炬,如何再次回到喚醒應(yīng)用的界面盐类。這個(gè)需要參考下官方的
XCallbackURL
。聽說有些復(fù)雜呛谜,有空再看看在跳。