zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    js_mongobd
    window-js-mongodb安装 错误 解决
    Mac-js-mongodb 安装
    PMP笔记-01 PMP各种图比较记忆
    kata qemu
    socat
    kata agent install syslog
    kata rootfs
    defaultKataGuestSharedDir
    kata 9p
  • 原文地址:https://www.cnblogs.com/lulushen/p/6400673.html
Copyright © 2011-2022 走看看