iOS应用间相互跳转
- 使用第三方用户登录,跳转到需授权的App。如QQ登录,微信登录等。 - 需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名、密码"。 
 
- 应用程序推广,跳转到另一个应用程序(本机已经安装),或者跳转到iTunes并显示应用程序下载页面(本机没有安装)。 
- 第三方支付,跳转到第三方支付App,如支付宝支付,微信支付。 
- 内容分享,跳转到分享App的对应页面,如分享给微信好友、分享给微信朋友圈、分享到微博。 
- 显示位置、地图导航,跳转到地图应用。 
- 使用系统内置程序,跳转到打电话、发短信、发邮件、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。
我们根据传递来的数据,进行反跳回去。
- 之前我们在应用App-B中通过 - AppDelegate执行不同页面的跳转。在对应方法中我们可以拿到完整的URL,在主控制器ViewController中设定一个属性,将该URL保存在主控制器中;
- 主控制器中我们可以通过- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;方法获取将要跳转的页面控制器;
- 将要跳转的页面控制器中定义一个属性,用于接受、截取出跳转回的应用(即App-A)的URL Schemes,执行跳转;
准备步骤:
- 因为我们想要跳转回应用A,首先我们要先设置应用App-A的URL Schemes,将其设置为AppA。同时在应用App-B中添加白名单。具体操作和之前相似。 
- 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];
}
}
iOS应用间相互跳转的更多相关文章
- 【转】iOS开发--一步步教你彻底学会『iOS应用间相互跳转』
		1. 应用间相互跳转简介 在iOS开发的过程中,我们经常会遇到需要从一个应用程序A跳转到另一个应用程序B的场景.这就需要我们掌握iOS应用程序之间的相互跳转知识. 下面来看看我们在开发过程中遇到的应用 ... 
- iOS - 白名单应用间相互跳转
		1. 应用间相互跳转简介 在iOS开发的过程中,我们经常会遇到需要从一个应用程序A跳转到另一个应用程序B的场景.这就需要我们掌握iOS应用程序之间的相互跳转知识. 下面来看看我们在开发过程中遇到的应用 ... 
- App间相互跳转及图片分享
		A-app: Info--URL Types--URL Schemes:A-app(一个标识,允许别的app调用本App) info.plist 添加白名单: LSApplicationQueries ... 
- iOS应用间的跳转和传值
		在第一个应用程序中info.plist设置 URL Identifier: 该字符串是你自定义的 URL scheme 的名字 注意: URL Schemes 是一个数组,允许应用定义多个 URL s ... 
- iOS应用程序开发之应用间的跳转(用着微信等第三方分享登陆)
		简介 配置和实现 判断应用启动方式 一.简介 最实际项目开发中,我们难免会遇到需要从一个应用跳转到另一个应用的情况.比如微信分享,实际就是一种应用间的跳转.但是有时候我们需要实现自己的两个应用间的跳转 ... 
- ios 界面间跳转方法总结
		接触ios也有一段时间了,偶然间,我们公司的技术总监兼我的导师,问我,你可知道,界面间的跳转有几种方式?我说出了两种,但是也有点含糊其辞,于是我就想一定要找个时间总结一下.有句话说的好,“前人种树,后 ... 
- ios业务模块间互相跳转的解耦方案
		*此文章需有一点runtime的知识,假设你不了解runtime,<高速理解Runtime of Objective-C>: http://mp.weixin.qq.com/s?__biz ... 
- iOS 程序间跳转传参(支付和地图)
		两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的. 1.首先设置第一个APP的url地址 2.接着设置第二个AP ... 
- iOS应用程序开发之应用间的跳转
		简介 配置和实现 判断应用启动方式 一.简介 最实际项目开发中,我们难免会遇到需要从一个应用跳转到另一个应用的情况.比如微信分享,实际就是一种应用间的跳转.但是有时候我们需要实现自己的两个应用间的跳转 ... 
随机推荐
- 通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ
			通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double ... 
- 【Kafka】Kafka-配置参数详解-参数调优
			Kafka-配置参数详解-参数调优 kafka 目录_百度搜索 为什么kafka使用磁盘而不是内存 - CSDN博客 Kafka 配置说明 - 風吹云动 - 博客园 kafka生产服务器配置 - Or ... 
- 论文分享|《Universal Language Model Fine-tuning for Text Classificatio》
			https://www.sohu.com/a/233269391_395209 本周我们要分享的论文是<Universal Language Model Fine-tuning for Text ... 
- capwap学习笔记——初识capwap(二)
			2.5.1 AC发现机制 WTP使用AC发现机制来得知哪些AC是可用的,决定最佳的AC来建立CAPWAP连接. WTP的发现过程是可选的.如果在WTP上静态配置了AC,那么WTP并不需要完成AC的发现 ... 
- Solr搭建真实项目
			在经过solr5.4.1 quick start 的学习后.我们要搭建真实的项目了 1.启动项目 bin/solr start 2.创建core bin/solr create -c pms 3.为 ... 
- ASP入门(二十一)- 如何自己获取 ADO 连接字符串
			1.新建一个文本文件,并将文件名修改为[ado.udl] 注意 如果不显示扩展名,请在资源管理器的[查看 | 选项]对话框中去掉"隐藏已知文件类型的扩展名"勾就可以了. 2.双击这 ... 
- PHP开发框架比较
			PHP开发框架比较 Laravel 是一个简单优雅的 PHP WEB 开发框架,将你从意大利面条式的代码中解放出来.通过简单.优雅.表达式语法开发出很棒的 WEB应用!但是通过使用我们发现Larave ... 
- C#.NET常见问题(FAQ)-如何判断两个类是否相同类型
			可以用is方法判断是否是一个类 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123 我的在线论坛: http://csr ... 
- Spring boot 各种入门及问题
			Spring boot 入门 整合(完整版): https://blog.csdn.net/winter_chen001/article/details/77249029 mybatis-genera ... 
- ZH奶酪:Ionic通过angularJS+tabs-item-hide实现自定义隐藏tab
			参考链接:http://stackoverflow.com/questions/23991852/how-do-i-hide-the-tabs-in-ionic-framework 1.index.h ... 
