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 

 

四、以上只是单项的从应用APP-One跳转到APP-Two, 如果应用APP-Two也有需求要跳转到APP-One,可以反过来配置,上面的代码有很都重复的地方只需要改动部分就行。https://github.com/lulushen/Jump-application.git

posted @ 2017-02-15 11:26  Belinda_sl  阅读(1860)  评论(0编辑  收藏  举报