两个app应用之间的跳转

2023-11-04

 

一,应用跳转的原理
从一个应用跳转到另一个应用,作为APP开发者,最熟悉的莫过于第三方登录,支付宝,微信支付时,那时候我们可能仅仅按照集成文档一步一步操作,在文档中配置很多类似URL Schemes,如下图:

 

 

一般的配置

下面我们进入正题的为什么这么配置:
1、一些概念的补充

协议:双方互相遵守的一种规范,只有遵守共同的协议规范才能进行彼此的通信。比如我们最熟悉的网络协议——http协议。
URL:资源的路径或地址。在IOS中有一个专门用于包装资源路径的类——NSURL。
一个完整URL的组成
例如:http://123.0.0.1/path?page=100
“http://”:协议类型
“123.0.0.1”:服务器ip地址
“/path”:资源存放的是路径
“page=100”:请求的参数
NSURL包装一个完整地址
NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];
NSLog(@"scheme(协议):%@",url.scheme);
NSLog(@"host(域名):%@",url.host);
NSLog(@"path(路径):%@",url.path);
NSLog(@"query(参数):%@",url.query);
打印结果如下:
2016-12-02 14:50:38.442 TestDemo[5632:406869] scheme(协议):http
2016-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.1
2016-12-02 14:50:38.442 TestDemo[5632:406869] path(路径):/path
2016-12-02 14:50:38.442 TestDemo[5632:406869] query(参数):page=100

2、跳转的原理
在iOS中,从一个app打开另一个app,这必然牵扯到两个app之间的交互和通信,像这种涉及到整个应用程序层面的事情,苹果有一个专门的类来管理——UIApplication。在ios中UIApplication其实就是代表着应用程序,这点从它的命名就可以窥之。而我们要打开另一个应用程序,如何实现呢?很简单,其实就是UIApplication下面这个 的API

/**
通过应用程序打开一个资源路径
@param url 资源路径的地址
@return 返回成功失败的信息
*/

  • (BOOL)openURL:(NSURL*)url;
    它的一些我们非常熟悉的用法:

//拨打系统电话
NSURL *url = [NSURL URLWithString:@"tel://10086"];
[[UIApplication sharedApplication] openURL:url];
//发送系统短信
NSURL *url = [NSURL URLWithString:@"sms://1383838438"];
[[UIApplication sharedApplication] openURL:url];
上面打电话和发短信的实现代码大同小异,唯一的区别是传递的NSURL参数不一样,导致他们跳转到不同的应用场景。

总结:一个应用能打开另一个应用的必然条件是,另一个应用必须配置一个scheme(协议),这样应用程序才能根据协议找到需要打开的应用。

二、实现两个app间的跳转
创建两个示例Demo,Test1Demo和Test2Demo,现在需要实现从Test2Demo跳转到Test1Demo中.
1、在被跳转的Test1Demo配置一个协议scheme,这里命名为test(名字最好是英文并且跟你项目相关)
targets -> info -> URL Types ->URL Scheme ->填写协议

配置

2、在Test2Demo执行跳转的方法中实现下面方法

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSURL *url = [NSURL URLWithString:@"test://"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

        [[UIApplication sharedApplication] openURL:url];

    }else{
        NSLog(@"没有安装应用");
    }
}

ok,到这里如果你的系统是ios9.0以下,已经大大功告成了。但是,如果是9.0以后,请看下一步。

3、配置协议白名单
在Test2Demo的info.plist文件中增加一个LSApplicationQueriesSchemes字段,把它设置为数组类型,并配置需要跳转的协议名单

 

配置

三、跳转到指定界面
想要跳转到指定界面,必然是上一个app告诉下一个app(被跳转的app)需要跳转到哪个界面,而如何告诉它这里便涉及到两个app的通信。我们从上面可以知道,两个app之间的跳转只需要配置一个scheme,然后通过UIApplication调用它的对象方法openURL:即可实现,除此之外再也没有实现任何代码了。而这之间是如何通信的呢?

答案依然是协议,请看下面步骤:

1、在"test://"协议后面的域名加上一些字段用来标记需要跳转的界面

//进入更多界面

- (IBAction)intoMore:(id)sender {
    NSURL *url = [NSURL URLWithString:@"test://more"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [application openURL:URL options:@{} completionHandler:nil];
    }else{
        NSLog(@"没有安装应用");
    }

}

//进入设置界面
- (IBAction)intoSet:(id)sender {

    NSURL *url = [NSURL URLWithString:@"test://set"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

        [[UIApplication sharedApplication] openURL:url];
    }else{
        NSLog(@"没有安装应用");
    }

}

2、来到被跳转的应用TestDemo的AppDelegate类的.m文件中,监听其代理方法application:handleOpenURL:

//当应用程序将要被其他程序打开时,会先执行此方法,并传递url过来

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    NSLog(@"url:%@",url.absoluteString);
    NSLog(@"host:%@",url.host);
    if ([url.host isEqualToString:@"more"]) {
        NSLog(@"进入更多界面");
        //到此做界面的跳转
    }

    if ([url.host isEqualToString:@"set"]) {
        NSLog(@"进入设置界面");
        //到此做界面的跳转
    }

    return YES;
}

参考部分文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个app应用之间的跳转 的相关文章

  • switch-case流程图

    第一种情况 每一个case后面都有break switch p case 1 process 1 break case 2 process 2 break case n process n break default process n 1

随机推荐

  • 02-蘑菇街爬虫mw-sign参数破解

    02 蘑菇街爬虫mw sign参数破解 目录 01 蘑菇街爬虫准备工作1 02 蘑菇街爬虫mw sign参数破解 03 蘑菇街爬虫概述 04 蘑菇街爬虫 店铺搜索页面 mw sign参数分析 经过网友断点测试 我们发现mw sign是经过两
  • 运维重点小知识点总结

    1 可以使用lsblk命令树形方式显示所有可用块设备情况 lsblk NAME MAJ MIN rm SIZE RO type mountpoint sda 8 0 0 232 9G 0 disk sda1 8 1 0 46 6G 0 pa
  • 使用Python批量提取TRMM降水数据均值

    今天给大家分享一个数据平均值的吧 好像从来没有分享过这个内容 以问题为导向利用Python帮助我们解决在科研中遇到的问题 最近有同学在处理TRMM降水数据的时候 说是要提取每个月的均 值出来 数据格式是tif栅格 目的也是非常明确的 提取多
  • Linux文件管理(文件/目录的创建、更改、删除)

    一 Linux文件命名规则 1 严格区分大小写 2 文件命名不能使用字符 3 目录或文件名的长度不能超过255个字符 建议 1 文件名由两个或两个以上单词组成时 尽量使用 来代替space键 2 尽量不用字母的大小写来区分文件或者目录 4
  • curl

    什么是curl命令 curl是利用URL语法在命令行方式下工作的开源文件传输工具 它被广泛应用在Unix 多种Linux发行版中 并且有DOS和Win32 Win64下的移植版本 如何在windows下使用curl命令 第一步 进入curl
  • 在 AIX 5.3 和 6.1 中使用 Veritas Volume Manager (VxVM) V5 管理逻辑卷

    引言 在 UNIX 存储管理市场上 有两家主要的领先厂商 IBM 和 Veritas 现在的 Symantec 两家公司都提供帮助 UNIX 系统管理员以非常灵活的方法管理存储设备的产品 Veritas 提供了 Veritas Volume
  • feign接口自动生成工具

    Feign Generator 介绍 最近发现开发spring cloud时 编写feign接口是一件痛苦的事 不仅要编写feign接口 还有fallback 请求参数和返回值等 大量重复工作 很浪费时间 于是便想到可以编写工具自动生成fe
  • Mysql触发器

    本文主针对小白 如何在数据库有数据变动得时候及时得到内容 MySQL触发器 Triggers 是一种数据库对象 它在指定的事件 例如插入 更新或删除数据 发生时自动执行一系列预定义的操作 触发器通常用于实施业务规则 数据完整性约束和自动化任
  • CentOS-7 RHEL-8 yum源的配置(本地yum源 + 互联网yum源)

    CentOS 7 RHEL 8 yum源的配置 本地yum源 互联网yum源 yum 全称为 Yellow dog Updater Modified 是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器 基于RP
  • 11款在线视频编辑和分享网站

    这是之前介绍的一些视频编辑相关工具 16个免费开源的视频编辑软件下载 VCASMO 在线创建混合多媒体演示 12款制作视频教程的屏幕录像工具 下面是现在要介绍的11款在线视频编辑和分享网站 收集的不够完全 各取所需 Jumpcut Jump
  • 【LaTeX】两张并排图片垂直对齐

    figure中插入两张并排图片 但是垂直无法居中 解决方法 通过 raisebox 2 height 抬高图片 例如 begin figure htbp centering subfigure ReLU begin minipage t 0
  • Linux 系统 less命令详解

    Linux中的less命令是一个非常常用的文本查看工具 它可以用于查看任意大小的文本文件 支持滚动翻页 搜索 标记等功能 在本文中 我们将详细介绍less命令的用法 参数和实例 并对其背后的原理和相关技术进行简要讲解 一 less命令的基本
  • flowable流程实例笔记(1)

    RuntimeService 运行服务类 支持启动的方式 流程定义 从这里获取资源文件 执行实例 流程实例中执行的每个环节 流程实例 一个流程实例包括所有运行的节点 一个流程中流程实例只有一个 启动一个实例 public void star
  • 关于性能测试,测试人员必须要知道的

    随着各企业的业务发展 用户量以及数据量的不断增加 系统承载的压力也会随之增加 服务系统的性能好坏又严重影响企业的利益 因此 性能测试重要性与需求越来越强烈 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应能力 在进行性能
  • RTSP和RTP、RTCP协议介绍

    一 RTSP 1 简介 RTSP Real Time Stream Protocol 协议是一个基于文本的多媒体播放控制协议 属于应用层 RTSP以客户端方式工作 对流媒体提供播放 暂停 后退 前进等操作 它主要用来控制具有实时特性的数据的
  • linux:nginx报错,提示host not found in upstream

    原因参考 解决 nginx 启动错误 nginx emerg host not found in upstream emerg host not found in upstream loaclhost
  • 代码随想录算法训练营第一天

    数组理论基础 文章链接 代码随想录 记忆 数组是存放在连续内存空间上的相同类型数据的集合 数组下标都是从0开始的 数组内存空间的地址是连续的 数组的元素是不能删的 只能覆盖 在C 中二维数组是连续分布的 像Java是没有指针的 同时也不对程
  • flutter打包的app有多大_前端大势所趋---Flutter 这篇文章会让你行动起来

    Flutter和原生APP的性能对比 前言 自从今年google IO大会推出flutter跨平台开发框架以来 flutter在各个技术论坛里被吵得如日中天 flutter团队直言flutter可以帮助开发者轻松实现恒定60fps的性能体验
  • Unity3d连接SQLServer数据库

    在编写代码之前需要 1 引入程序集System Data dll 位置在C Program Files Unity Editor Data Mono lib mono unity 我unity默认装在C盘 2 把System Data dl
  • 两个app应用之间的跳转

    一 应用跳转的原理 从一个应用跳转到另一个应用 作为APP开发者 最熟悉的莫过于第三方登录 支付宝 微信支付时 那时候我们可能仅仅按照集成文档一步一步操作 在文档中配置很多类似URL Schemes 如下图 一般的配置 下面我们进入正题的为