第一:什么是URL Scheme
与Android的URL Scheme类似,是为方便app之间互相调用而设计的。你可以通过一个类似URL的链接,通过系统的OpenURl来打开该app,并可以传递一些参数。每个URL必须能唯一标识一个APP,如果你设置的URL与别的APP的URL冲突,此时,你的APP不一定会被调用起来,原因是当APP在安装的时候就已经在系统里面注册了此APP的URL Scheme,如果你的一致但是是后安装的,那么系统不会调用你的APP,因为你的APP设置的URL scheme被覆盖了。
当然系统的APP的URL Scheme是优先级高的,不用想着能覆盖系统APP的URL Scheme的注册调用。
第二:URL Scheme有什么作用:
大家知道在IOS系统里面APP之间是相互隔离的,不像Android,每个组件都可以作为一个独立的功能被其他APP调用,但是,IOS系统里面也需要完成类似于三方功能如支付、搜索跳转、导航等等跨APP的功能,怎么实现呢,苹果就使用了URL Scheme来实现了这个功能。通过各个APP设计的符合苹果的统一规范的URL Scheme,系统就会自动去调用相关的APP来完成你的请求。
比如:我们的APP需要使用支付宝的三方支付功能、我的APP需要使用微信分享好的文章,那么此时就可以通过URL Scheme来传递这些数据到支付宝APP或者微信APP,系统会通过这些APP的URL Scheme来调起这些APP,完成你所需要做的跨APP的功能。
第三:怎么使用呢?
例如 A 要跳转到B
3.1首先要在B 工程 中设置URL Schemes ;如下:
3.2 在A工程中添加白名单
3.3 在 A工程中我们添加二个按钮一个按钮是通过app canOpenURL方法直接跳转,第二个按钮是push到另个控制器然后加载UIWebView,在webview中加载打开;如下图:
//app直接调用canOpenURL 调起
- (IBAction)openOtherAPP:(UIButton *)sender {
NSString *url = [NSString stringWithFormat:@"zenjoyclient://?name=jack&token=appAESBLKIJOPOI12LK"];
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]]) {
//后跟的是参数
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
}
//push 另一个控制器加载webview 调起
- (IBAction)webViewGoto:(id)sender {
WebViewController *vc=[[WebViewController alloc]init];
[self.navigationController pushViewController:vc animated:YES];
}
3.4 WebViewController.m 实现
4 B 工程中接收传过来的值代码如下:
在 AppDelegate.m 中实现方法
#pragma mark ==== app跳转 =======
//For iOS 4.1 and earlier
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
NSString *info=url.host;
LOG(@"app跳转info==%@",info);
//不推荐使用此方法接收参数,本人发现在iOS 9.3.3版本有取不到值情况
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"app跳转" message:info delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alert show];
return YES;
}
/* For iOS 4.2 and later */
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
// Handle url request. 推荐使用此方法
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"app跳转" message:[url absoluteString] delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alert show];
return YES;
}
上图 是我使用application handleOpenURL:方法无法接收到get方法传来的数据,但是如果直接在后面拼接参数方式是可以收到的
//这种以get方式无法接收到
NSString *url = [NSString stringWithFormat:@"zenjoyclient://?name=jack&token=webAESBLKIJOPOI12LK"];
//下面这种方式就可以
NSString *url = [NSString stringWithFormat:@"zenjoyclient://?1111111"];
以后我选择了4.2 这个方法去接收数据application openURL:(NSURL *)url sourceApplication:
下图是我全部使用 get 方式传参数用 第二种方法接收就没问题
再次提示,在B appDelegate 中实如下方法去接收A传来的参数
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;