什么是Scheme?
简单的说,由于苹果选择沙盒来保障用户的隐私和安全,App只能访问自己的沙盒,但同时也阻碍了应用间合理的信息共享。所以苹果提供了一个可以在App之间跳转的方法:URL Scheme。
在以本地应用为主的 iOS 上,我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能,而定位这个应用的标识,也就是Scheme。
例如,多数app会跳转到支付宝或微信去支付,此时就是通过支付宝或微信里设定好的Scheme直接跳转到支付宝或微信的支付功能。
URL的基本格式
protocol(Scheme) :// hostname[:port] / path / [;parameters][?query]#fragment
protocol(Scheme) :协议名称,例如 http、https,和你自己定义的 Scheme。
hostname:域名系统主机名或ip地址,例如 www.baidu.com 就是域名主机号。
port:端口号,例如 www.baidu.com:80后面的80就是端口号,如果省略就使用默认的。
path:路径,表示主机上的目录或文件路径,主机号后由零个或多个 / 隔开。例如:https://fanyi.baidu.com/translate。
query:可选项,用于传递参数,由?符号开始,&符号隔开,参数名和值用=符号相连。例如:https://www.baidu.com/s?ie=utf-8&wd=ios。
fragment:指定网络资源中的片断,一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。例如:https://baike.baidu.com/item/URL/10056474#2 。
URL Scheme的应用场景
1.使用iOS系统预设的URL Scheme调用系统App:iOS系统内置的App,如mail,电话等等,都有相应的URL Scheme供其他的App调用.例如:tel://13636363636 就是调用系统电话给13636363636打电话。其他就不再赘述。
2.打开第三方app或使用第三方app的功能,可以使用第三方定义好的Scheme来访问。
3.定义Scheme,让别的应用或网页可以打开自己的app。
4.跨App间的一些交互:这个其实与第二条类似,但是分开说是因为,假如你们公司有2个以上的App或者你自己开发的多款App,要进行进程间的数据共享或者其他操作,完全可以使用URL Scheme进行一些具有想象力的操作。
URL Scheme的简单使用
首先先为自己的app定义一个Scheme,在info.plist里添加URL Types。
蓝色箭头指向是URL identifier,它是URL scheme的名字,为了避免与其他App的重复,一般使用翻转域名来定义。
蓝色箭头指向是你需要自定义的URL scheme,不区分大小写,URL Schemes是一个数组,这意味着你可以定义多个URL Scheme。
然后在AppDelegate.h里面实现一下代码。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//打印一些信息
NSLog(@"从哪个app跳转而来 Bundle ID: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
NSLog(@"URL host: %@", [url host]);
NSLog(@"URL port: %@", [url path]);
// 提示并展示query
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开URL Scheme成功"
message:[url query]
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alertView show];
return YES;
}
此时用Safari,在在地址栏像输入地址一样输入我们定义的Scheme
://
点击open就会打开或跳转到你的app。
还可以输入更复杂的Scheme,例如 mztapp://cn.mymzt.pay/order/detail?order=1&expires=2 像网址一样也同样可以打开。
打印信息:
所以要输入这么复杂的Scheme,第一个可以用不同的路径,在- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;去跳转不同的功能模块;第二个可以通过参数进行传值。