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给跳转界面Page1Page1Vc.urlString = self.urlString;} else if ([segue.identifier isEqualToString:@"homeToPage2"]) {// 获得将要跳转的界面Page2的控制器Page2ViewController *Page2Vc = segue.destinationViewController;// 保存完整的App-A的URL给跳转界面Page1Page2Vc.urlString = self.urlString;} }
5、对应界面控制器Page1ViewController和Page2ViewController中实现跳转代码
- Page1ViewController.m - (IBAction)page1BackToAppA:(id)sender {// 1.拿到对应应用程序的URL SchemeNSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];// 2.获取对应应用程序的URLNSURL *url = [NSURL URLWithString:urlString];// 3.判断是否可以打开if ([[UIApplication sharedApplication] canOpenURL:url]) {[[UIApplication sharedApplication] openURL:url];} }
- Page2ViewController.m - (IBAction)page2BackToAppA:(id)sender {// 1.拿到对应应用程序的URL SchemeNSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];// 2.获取对应应用程序的URLNSURL *url = [NSURL URLWithString:urlString];// 3.判断是否可以打开if ([[UIApplication sharedApplication] canOpenURL:url]) {[[UIApplication sharedApplication] openURL:url];} }
iOS应用间相互跳转相关推荐
- (0089)iOS开发之iOS应用间相互跳转(URL Scheme)
需求:假设有应用A和应用B两个应用,现在需要从应用A跳转到应用B中.如果手机中没有安装跳到下载页,如果已经安装直接打开APP. 认识URL Scheme URL Schemes是苹果给出的用来跳转到系 ...
- iOS开发--一步步教你彻底学会『iOS应用间相互跳转』
http://www.cocoachina.com/ios/20161026/17855.html 转载于:https://www.cnblogs.com/supper-Ho/p/6634461.ht ...
- iOS storyboard 与 xib 间相互跳转
项目结构 storyboard 跳转到 xib restaurantViewController *vc = [[restaurantViewController alloc] initWithNib ...
- VUE:组件间相互跳转、页面带参跳转
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 只是记录下用法: 从 A 页面跳转到 B 页面. 如下写法: A 页面跳转方式: 代码: getda ...
- qiankun微应用之间、主微应用之间相互跳转方式总结与实践
一.子应用互相访问 1.背景 (1)未来可能需要做不同子应用菜单的合并,如在bi应用下的侧边栏或者别的地方,需要跳转到数据治理的数仓主题里,或者涉及到子应用值改变,其他应用也需要使用: (2)a标签跳 ...
- ios业务模块间互相跳转的解耦方案
*此文章需有一点runtime的知识,假设你不了解runtime,<高速理解Runtime of Objective-C>: http://mp.weixin.qq.com/s?__biz ...
- iOS iOS9下实现app间的跳转
自从更新了Xcode7后,苹果公司增加了白名单. 在实现app跳转时,必须把app的唯一标示URL加入到白名单中 - (BOOL)canOpenURL:(NSURL *)url这个方法才会返回yes否 ...
- 不同视图间的跳转方式
从一个视图控制器切换到另一个视图控制器的几种方式 1,模态(modal)画面的显示方法: 例如iphone通讯录管理程序中,追加新的通讯纪录时,就是使用这种模态画面 例:点击一个按钮,进入另一个界面 ...
- Microbiome:应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系(一作解读)...
Microbiome: 应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系 香港大学张彤教授团队与北京大学余珂博士研究团队,以生物降解菌群为研究模型,运用多维宏组学方法(宏基因组.宏转 ...
最新文章
- 概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现
- Keil的HTM 文件分析
- 安装CM 6.3.1和CDH 6.3.2
- Linux 设备驱动开发 —— platform 设备驱动
- 第三周 day14:内置函数
- nodejs html引用js_nodejs做出最简单的网页服务端。【501】
- 清掉数据_大数据超详尽分析,带你看懂打野江湖
- android每秒 1,在Android 5.1中调度每秒的警报
- ubuntu恢复出厂设置_苹果恢复出厂设置,小编告诉你苹果手机怎么恢复出厂设置?...
- android:DDMS查看Threads
- PVNet(6D姿态估计)
- [转载]数字全息与计算全息
- Android开发中验证码的生成
- 谷歌chromeos_如何安装Chrome OS系统
- 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程(转)
- java 过滤微信昵称_java过滤微信昵称特殊字符
- Hubble数据库x某股份制商业银行 信用卡反欺诈项目构建2.4亿条社交网络库
- dejavu项目笔记
- 男人凭什么三十而立——一定要攒点钱
- 华为电脑如何投屏到电视linux,华为手机怎么投屏到电视?这2个方法又快又简单...
热门文章
- python发声-python写报警程序中的声音实现winsound
- 学python好不好-Python就业前景好不好?学Python好找工作吗?
- python爬虫教程推荐-33个Python爬虫项目实战(推荐)
- 错误:AttributeError: module 'enum' has no attribute 'IntFlag'
- 什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
- HDU2018 母牛的故事
- IGMP Internet组管理协议 未完
- 画一个皮卡丘项目小结(4)
- 电商总结(八)如何打造一个小而精的电商网站架构
- iOS学习笔记(1)--认识Xcode6.1的Interface Builder和常用快捷键