zoukankan      html  css  js  c++  java
  • iOS应用间相互跳转

    1. 使用第三方用户登录,跳转到需授权的App。如QQ登录,微信登录等。

      • 需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名、密码"。

    2. 应用程序推广,跳转到另一个应用程序(本机已经安装),或者跳转到iTunes并显示应用程序下载页面(本机没有安装)。

    3. 第三方支付,跳转到第三方支付App,如支付宝支付,微信支付。

    4. 内容分享,跳转到分享App的对应页面,如分享给微信好友、分享给微信朋友圈、分享到微博。

    5. 显示位置、地图导航,跳转到地图应用。

    6. 使用系统内置程序,跳转到打电话、发短信、发邮件、Safari打开网页等内置App中。

    一、应用A跳转到应用B

    B应用设置 URL Schemes

    A应用中添加按钮

    - (IBAction)clickedBtn:(UIButton *)sender {
        
        NSURL * appBUrl = [NSURL URLWithString:@"AppB://"];
        if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) {
            [[UIApplication sharedApplication] openURL:appBUrl options:@{} completionHandler:^(BOOL success) {
                
            }];
        }else{
            NSLog(@"没有安装");
        }
    }

    如果是iOS9之前的模拟器或是真机,那么在相同的模拟器中先后运行App-B、App-A,点击按钮,就可以实现跳转了;iOS9之后的模拟器或是真机,那么则需要再在应用程序App-A中将B应用的URL Schemes添加到白名单中,原因和做法如下:

    • iOS9引入了白名单的概念。在iOS9中,如果使用 canOpenURL:方法,该方法所涉及到的 URL Schemes 必须在"Info.plist"中将它们列为白名单,否则不能使用。key叫做LSApplicationQueriesSchemes ,键值内容是对应应用程序的URL Schemes。

    添加白名单之后在相同的模拟器中先后运行App-B、App-A,点击按钮,就可以实现跳转了。

    二、应用A跳转到应用B中特定的页面

      很多时候,我们做应用程序之间的跳转并不只是跳转到其他程序就可以了,而是要跳转到其他程序的特定页面上。比如我们在浏览网页时,会有分享到微信朋友圈或是分享给微信朋友,这就需要跳转到微信朋友圈界面或是微信朋友选择界面。

    在应用App-B中通过AppDelegate监听跳转,进行判断,执行不同页面的跳转

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        // 1.获取导航栏控制器
        UINavigationController * rootNav = (UINavigationController *)self.window.rootViewController;
        // 2.获得主控制器
        ViewController * mainVc = [rootNav.childViewControllers firstObject];
        
        // 3.每次跳转前必须是在跟控制器(细节)
        [rootNav popToRootViewControllerAnimated:NO];
        
        // 4.根据字符串关键字来跳转到不同页面
        if ([url.absoluteString containsString:@"Page1"]) { // 跳转到应用App-B的Page1页面
            // 根据segue标示进行跳转
            [mainVc performSegueWithIdentifier:@"homeToPage1" sender:nil];
        } else if ([url.absoluteString containsString:@"Page2"]) { // 跳转到应用App-B的Page2页面
            // 根据segue标示进行跳转
            [mainVc performSegueWithIdentifier:@"homeToPage2" sender:nil];
        }
        
        return YES;
    }

    应用程序App-A中添加两个用来点击跳转的Button,一个跳转到Page1,一个跳转到Page2,并监听点击事件,添加跳转代码。

    - (IBAction)clickedPage1:(UIButton *)sender {
        NSURL * appBUrl = [NSURL URLWithString:@"AppB://Page1"];
        if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) {
            [[UIApplication sharedApplication] openURL:appBUrl];
        } else {
            NSLog(@"没有安装");
        }
    }
    
    - (IBAction)clickedPage2:(UIButton *)sender {
        NSURL * appBUrl = [NSURL URLWithString:@"AppB://Page2"];
        if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) {
            [[UIApplication sharedApplication] openURL:appBUrl];
        } else {
            NSLog(@"没有安装");
        }
    }

    三、从应用B跳转回应用A

    我们想要从应用B再跳转回应用A,那么在跳转到应用B的时候,还应将应用A的URL Schemes传递过来。这样我们才能判断应该跳转回哪个应用程序。

    • 这样我们指定一个传递URL的规则:协议头://应用B的URL Schemes?应用A的URL Schemes。即:AppB://Page1?AppA

    我们根据传递来的数据,进行反跳回去。

    1. 之前我们在应用App-B中通过AppDelegate执行不同页面的跳转。在对应方法中我们可以拿到完整的URL,在主控制器ViewController中设定一个属性,将该URL保存在主控制器中;

    2. 主控制器中我们可以通过- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;方法获取将要跳转的页面控制器;
    3. 将要跳转的页面控制器中定义一个属性,用于接受、截取出跳转回的应用(即App-A)的URL Schemes,执行跳转;

    准备步骤:

    1. 因为我们想要跳转回应用A,首先我们要先设置应用App-A的URL Schemes,将其设置为AppA。同时在应用App-B中添加白名单。具体操作和之前相似。

    2. App-B项目中的Page1和Page2两个页面各添加一个Button,用于跳转回App-A。同时添加Page1和Page2的页面控制器Page1ViewController和Page2ViewController。

    实现步骤:

      1、App-A中修改传递的URL

    • 分别修改为:@"AppB://?AppA"@"AppB://Page1?AppA"@"AppB://Page2?AppA"

      2、App-B的主控制器ViewController中增加一条属性@property (nonatomic, copy) NSString *urlString;,并在App-B中通过AppDelegate中保存完整的URL。

      3、将要跳转的页面控制器Page1ViewController和Page2ViewController中定义一个属性@property (nonatomic, copy) NSString *urlString;,用于接受、截取出跳转回的应用(即App-A)的URL Schemes,执行跳转。

      4、重写App-B的主控制器的- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
       if ([segue.identifier isEqualToString:@"homeToPage1"]) {
           // 获得将要跳转的界面Page1的控制器
           Page1ViewController *Page1Vc = segue.destinationViewController;
           // 保存完整的App-A的URL给跳转界面Page1
           Page1Vc.urlString = self.urlString;
       } else if ([segue.identifier isEqualToString:@"homeToPage2"]) {
           // 获得将要跳转的界面Page2的控制器
           Page2ViewController *Page2Vc = segue.destinationViewController;
           // 保存完整的App-A的URL给跳转界面Page1
           Page2Vc.urlString = self.urlString;
       }
    }

      5、对应界面控制器Page1ViewController和Page2ViewController中实现跳转代码

    - Page1ViewController.m
    - (IBAction)page1BackToAppA:(id)sender {
       // 1.拿到对应应用程序的URL Scheme
       NSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
       NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];
    
       // 2.获取对应应用程序的URL
       NSURL *url = [NSURL URLWithString:urlString];
    
       // 3.判断是否可以打开
       if ([[UIApplication sharedApplication] canOpenURL:url]) {
           [[UIApplication sharedApplication] openURL:url];
       }
    }
    - Page2ViewController.m
    - (IBAction)page2BackToAppA:(id)sender {
       // 1.拿到对应应用程序的URL Scheme
       NSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
       NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];
    
       // 2.获取对应应用程序的URL
       NSURL *url = [NSURL URLWithString:urlString];
    
       // 3.判断是否可以打开
       if ([[UIApplication sharedApplication] canOpenURL:url]) {
           [[UIApplication sharedApplication] openURL:url];
       }
    }
  • 相关阅读:
    python学习笔记
    win10优化设置
    jpa基本用法
    5_方法(函数)、参数传递
    12_文件基本权限
    10_管理用户和组
    9_用户和组的相关配置文件
    7_vim 编辑器使用技巧
    8_Xmanager 远程连接 Linux 系统工具使用方法
    5_Linux系统目录结构,相对/绝对路径
  • 原文地址:https://www.cnblogs.com/fengmin/p/6560314.html
Copyright © 2011-2022 走看看