iOS 应用跳转(跳转应用没有指定界面、跳转指定界面、有参数、无参数)
此文章讲述应用APP-One跳转应用APP-Two的四种情况:
1、直接跳转应用没有指定界面、没有参数
2、跳转应用没有指定界面、有参数
3、跳转应用指定界面、没有参数
4、跳转应用指定界面、有参数
一、用Xcode创建两个项目APP-One和APP-Two
二、在APP-One项目info.plist文件中增加key-LSApplicationQueriesSchemes、类型Type-Array,添加item-string-APPTwo,如图所示
在APP-Two项目info.plist文件中增加key-URL types、类型Type-Array,Item0的下一级URL identifier改成URL Schemes,URL Schemes的下一级Item-string-APPTwo(APPTwo和第一个应用的LSApplicationQueriesSchemes下级item0中的保持一致),如图所示:
三、在APP-One项目的跳转方法中实现跳转
(1)直接跳转应用没有指定界面、没有参数h
APP-One项目FirstViewController.h的noInterfaceAndNoParamClick方法中
//跳转应用没有指定界面、没有参数
- (IBAction)noInterfaceAndNoParamClick:(UIButton *)sender {
NSURL *appTwoUrl = [NSURL URLWithString:@"APPTwo://"];
// 2.判断手机中是否安装了对应程序
if ([[UIApplication sharedApplication] canOpenURL:appTwoUrl]) {
// 3. 打开应用程序App-Two
[[UIApplication sharedApplication] openURL:appTwoUrl];
} else {
NSLog(@"没有安装");
}
}
结果:
还有一种情况:如果没有指定跳转界面时,但是有指定跳转的模块时需要在APP-Two项目APPDelegate.m中添加方法,
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
// 1.获取TabBarViewController
TabBarViewController *rootTB = (TabBarViewController *)self.window.rootViewController;
//如果跳转的界面在第二或第三个item中则rootTB.selectedIndex = 1或2,如果跳转到第一个模块就不需要此步
rootTB.selectedIndex = 1;
return YES;
}
如图所示:
结果:
(2)跳转应用没有指定界面、有参数
在APP-One项目FirstViewController.h的noInterfaceAndSomeParamClick方法中
- (IBAction)noInterfaceAndSomeParamClick:(UIButton *)sender {
NSString *paramStr = [NSString stringWithFormat:@"APPTwo://username=%@&password=%@", @"test", @"1234"]
NSURL *appTwoUrl = [NSURL URLWithString:[paramStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// 2.判断手机中是否安装了对应程序
if ([[UIApplication sharedApplication] canOpenURL:appTwoUrl]) {
// 3. 打开应用程序App-Two
[[UIApplication sharedApplication] openURL:appTwoUrl];
} else {
NSLog(@"没有安装");
}
}
在APP-Two项目的APPDelegate.m中添加方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSString *urlStr = [url absoluteString];
if ([urlStr hasPrefix:@"APPTwo://"]) {
urlStr = [urlStr stringByReplacingOccurrencesOfString:@"APPTwo://" withString:@""];
NSArray *paramArray = [urlStr componentsSeparatedByString:@"&"];
NSLog(@"paramArray: %@", paramArray);
NSMutableDictionary *paramsDic = [[NSMutableDictionary alloc] initWithCapacity:0];
for (int i = 0; i < paramArray.count; i++) {
NSString *str = paramArray[i];
NSArray *keyArray = [str componentsSeparatedByString:@"="];
NSString *key = keyArray[0];
NSString *value = keyArray[1];
[paramsDic setObject:value forKey:key];
NSLog(@"key:%@ ==== value:%@", key, value);
}
}
return YES;
}
打印的结果如图下图,获取的值可以使用在APP-Two应用中,
(3)跳转应用指定界面、没有参数
eg:跳转到第二个模块中的第二个界面
在APP-One项目FirstViewController.h的InterfaceAndNoParamClick方法中
//跳转应用指定界面、没有参数
- (IBAction)InterfaceAndNoParamClick:(UIButton *)sender {
//”secendToSecend“界面标示
NSURL *appTwoUrl = [NSURL URLWithString:@"APPTwo://secendToSecend"];
// 2.判断手机中是否安装了对应程序
if ([[UIApplication sharedApplication] canOpenURL:appTwoUrl]) {
// 3. 打开应用程序App-Two
[[UIApplication sharedApplication] openURL:appTwoUrl];
} else {
NSLog(@"没有安装");
}
}
在APP-Two项目的APPDelegate.m中添加方法,如下图所示:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
// 1.获取TabBarViewController
TabBarViewController *rootTB = (TabBarViewController *)self.window.rootViewController;
//如果跳转的界面在第二或第三个item中则rootTB.selectedIndex = 1或2,如果跳转到第一个模块就不需要此步
rootTB.selectedIndex = 1;
//2.获得NavigationController
UINavigationController * mainVC = rootTB.childViewControllers[rootTB.selectedIndex] ;
//3.每次跳转前必须是在根控制器(如果不在在控制器跳转的话可能会出现bug,eg:应用Two在指定界面时,应用One跳转再到指定界面会出现重复界面)
[mainVC popToRootViewControllerAnimated:NO];
//将我们的storyBoard实例化,“Main”为StoryBoard的名称
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//将第二个控制器实例化,"SecondViewController"为我们设置的控制器的ID
SecendSecendViewController *secondSVC = [mainStoryBoard instantiateViewControllerWithIdentifier:@"SecendSecendViewController"];
//跳转事件
[mainVC pushViewController:secondSVC animated:YES];
return YES;
}
在storyboard也需要设置storyboard ID 为“SecendSecendViewController”:
结果(图片比较模糊):
(4)、跳转应用指定界面、有参数
eg:跳转到第二个模块中的第二个界面,参数:用户名:test,密码:1234
在APP-One项目FirstViewController.h的InterfaceAndNoParamClick方法中
//跳转应用指定界面、有参数
- (IBAction)InterfaceAndSomeParamClick:(UIButton *)sender {
NSString *paramStr = [NSString stringWithFormat:@"APPTwo://secendToSecend?username=%@&password=%@", @"test", @"1234"];
NSURL *appTwoUrl = [NSURL URLWithString:[paramStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// 2.判断手机中是否安装了对应程序
if ([[UIApplication sharedApplication] canOpenURL:appTwoUrl]) {
// 3. 打开应用程序App-Two
[[UIApplication sharedApplication] openURL:appTwoUrl];
} else {
NSLog(@"没有安装");
}
}
在APP-Two项目的APPDelegate.m中添加方法,如下图所示:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotatio
{
// 1.获取TabBarViewController
TabBarViewController *rootTB = (TabBarViewController *)self.window.rootViewController;
//如果跳转的界面在第二或第三个item中则rootTB.selectedIndex = 1或2,如果跳转到第一个模块就不需要此步
rootTB.selectedIndex = 1;
//2.获得NavigationController
UINavigationController * mainVC = rootTB.childViewControllers[rootTB.selectedIndex] ;
//将我们的storyBoard实例化,“Main”为StoryBoard的名称
//3.每次跳转前必须是在根控制器(如果不在在控制器跳转的话可能会出现bug,eg:应用Two在指定界面时,应用One跳转再到指定界面会出现重复界面)
[mainVC popToRootViewControllerAnimated:NO];
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//将第二个控制器实例化,"SecondViewController"为我们设置的控制器的ID
SecendSecendViewController *secondSVC = [mainStoryBoard instantiateViewControllerWithIdentifier:@"SecendSecendViewController"];
//跳转事件
[mainVC pushViewController:secondSVC animated:YES];
NSString *urlStr = [url absoluteString];
if ([urlStr hasPrefix:@"APPTwo://"]) {
urlStr = [urlStr stringByReplacingOccurrencesOfString:@"APPTwo://secendToSecend?" withString:@""];
NSArray *paramArray = [urlStr componentsSeparatedByString:@"&"];
NSLog(@"paramArr: %@", paramArray);
NSMutableDictionary *paramsDic = [[NSMutableDictionary alloc] initWithCapacity:0];
for (int i = 0; i < paramArray.count; i++) {
NSString *str = paramArray[i];
NSArray *keyArray = [str componentsSeparatedByString:@"="];
NSString *key = keyArray[0];
NSString *value = keyArray[1];
[paramsDic setObject:value forKey:key];
NSLog(@"key:%@ value:%@", key, value);
}
}
return YES;
}
打印的结果如图下图,获取的值可以使用在APP-Two应用中,
2017-02-15 11:13:43.224 APP-Two[1959:84587] paramArr: (
"username=test",
"password=1234"
)
2017-02-15 11:13:43.224 APP-Two[1959:84587] key:username value:test
2017-02-15 11:13:43.224 APP-Two[1959:84587] key:password value:1234