在平常的开发中,会经常遇到从我们自己的App跳转到其他App,如微信分享,第三方支付,使用系统的内置程序等;
应用跳转原理
通过应用程序的自定义的协议头(URL Schemes),只需配置应用程序的协议头即可。
比如有两个应用,一个是应用A,一个是应用B,
- 通过设置应用B的URL Schemes,应用B将其自身“绑定”到一个自定义URL Schemes上,就可以从应用A中利用应用B的URL Schemes启动应用B;
配置URL Schemes
配置URL Schemes.png这里有个点需要注意:
- iOS9之前不需要设置白名单,就可以实现跳转;
-
iOS9之后,要跳转应用的URL Schemes添加到白名单中(白名单在Info.plist设置,对应的key为LSApplicationQueriesSchemes),否则不能使用;
LSApplicationQueriesSchemes.png
接下来通过代码来实现应用间的跳转,事先先创建两个应用,然后将各自的URL Schemes配置为AppA和AppB,并且设置白名单。
1. 应用A跳转应用B
AppA跳转AppB.gif- (IBAction)jumpToAppB:(id)sender {
NSURL *url = [NSURL URLWithString:@"AppB://"];
//判断是否可以打开应用B
if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"无法打开应用B");
}
}
2. 应用A跳转应用B,打开指定页面
-
在应用B中创建两个页面。
两个页面.png -
代码
- (IBAction)jumpToAppBHomePage:(id)sender {
NSURL *url = [NSURL URLWithString:@"AppB://home"];
//判断是否可以打开应用B
if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
//打开应用程序App-B的Home页面
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"无法打开应用B");
}
}
- (IBAction)jumpToAppBDetailPage:(id)sender {
NSURL *url = [NSURL URLWithString:@"AppB://detail"];
//判断是否可以打开应用B
if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
//打开应用程序App-B的Detail页面
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"无法打开应用B");
}
}
- 在应用B的AppDelegate中,重写
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
//注意:这里只是简单的跳转页面,具体跳转还是要跟实际相关,比如是是在当前页面在打开新页面,还是要回到首页在打开新页面
UIViewController *rootVC = self.window.rootViewController;
if ( [url.absoluteString containsString:@"home"] ) {
//跳转Home页面
HomeVC *homeVC = [[HomeVC alloc] init];
[rootVC presentViewController:homeVC animated:YES completion:nil];
} else if ( [url.absoluteString containsString:@"detail"] ) {
//跳转Detail页面
DetailVC *detailVC = [[DetailVC alloc] init];
[rootVC presentViewController:detailVC animated:YES completion:nil];
}
return YES;
}
效果图就不给出了。自己补脑。嘻嘻!
3. 应用A跳转应用B后,应用B在跳转会应用A
从应用B再跳转回应用A,那么在跳转到应用B的时候,要将应用A的URL Schemes传递过来。
URL的规则:
应用B的协议头://额外的参数?应用A的协议头
其中:? 是分割符
具体怎么保存应用A的协议头,就看具体页面,看是保存为局部变量还是全局变量,在需要的时候在拿出来使用。记得要在协议头后面拼接上://。
简单代码如下
//比如应用A跳转的地址为:AppB://home?AppA
//这边假设上面的AppB://home?AppA 存储在局部变量中 urlString
NSString *jumpUrlScheme = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://", jumpUrlScheme]];
//判断是否可以打开应用B
if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
//打开应用程序App-B的Home页面
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"无法打开应用");
}
over!
网友评论