网上也有讲这块的,感受讲得都不是很好。并且有一些细节根本没有讲清楚。这里重写整理一下相关知识点。数组
iOS
有个特性就是应用将其自身”绑定”到一个自定义 URL scheme
上,该 scheme
用于从浏览器或其余应用中启动本应用。常见的分享到第三方之间的跳转都是基于Scheme
的。浏览器
经过对比网页连接来理解iOS
上的 URL Schemes
,应该就容易多了。安全
URL
,咱们都很清楚,http://www.apple.com
就是个URL
,咱们也叫它连接或网址;Schemes
,表示的是一个 UR
L 中的一个位置——最初始的位置,即 ://
以前的那段字符。好比 http://www.apple.com
这个网址的Schemes
是 http。根据咱们上面对URL Schemes
的使用,咱们能够很轻易地理解,在以本地应用为主的 iOS 上,咱们能够像定位一个网页同样,用一种特殊的 URL
来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该这个应用的URL 的 Schemes
部分,也就是开头儿那部分。好比短信,就是 sms:
微信
你能够彻底按照理解一个网页的 URL ——也就是它的网址——的方式来理解一个 iOS 应用的 URL,拿苹果的网站和 iOS 上的微信来作个简单对比:app
网页(苹果) | iOS 应用(微信) | |
---|---|---|
网站首页/打开应用 | http://www.apple.com | weixin:// |
子页面/具体功能 | http://www.apple.com/mac/(Mac页面) | weixin://dl/moments(朋友圈) |
关于基础概念性的就讲这么多ide
Info
的Url Type
中配置(被唤起端)
Url Type
,表示能够被哪些带前缀Url打开,而不是能够打开以这些前缀开头的app。网站
com.*.*
反转域名的方法保证该名字的惟一性。Plist
文件中配置URL Schemes
是一个数组,容许应用定义多个 URL schemes
。 在代理方法- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
中判断唤起的来源source app
,根据Url
所携带的参数进行不一样的操做。好比跳转到制定的页面,相关的逻辑处理等等.url
- (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; }
以上配置是在被唤起应用中配置的。spa
通常状况下,唤起端能够直接调用appDelegate
的代理方法去唤醒其余应用。代理
- (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
的安全性,须要给出一个相似白名单的东西,在白名单里面的才能打开app
。否则报错: -canOpenURL: failed for URL: "OpenAppTest://mark?id=007" - error: "This app is not allowed to query for scheme OpenAppTest"
经过上面的方法能够唤醒其余的应用,简单总结下一些注意事项。
LSApplicationQueriesSchemes
千万不能忘。XCallbackURL
。据说有些复杂,有空再看看。