• app应用跳转的原理解析

  • 如何实现两个app应用之间的跳转

  • 如何实现两个app之间跳转到指定界面

二、应用跳转原理

  相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫过于第三方登录,支付宝支付等等。这些东西大家都耳熟能详,集成进来也很简单,跟着第三方sdk集成文档一步步走下来就是了,通常sdk集成文档都需要你在工程中配置一堆堆的东西,但是配置的这些东西,你真的明白了吗?比如下面这个,第三方登录或分享需要你配置的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];

看到这里也许有人会有疑问:拨打系统电话、发送系统短信跟我本篇要讲的应用间的跳转有什么关系呢?

呵呵,不要着急,重点来了:你难道不觉得拨打系统电话、发送系统短信其实就是应用间的跳转吗?只要一执行以上两个方法就会从你当前的应用跳转到系统的拨打电话界面、发送短信界面,这难道还不够应用间的跳转吗?其实你也可以这么理解:拨打系统电话、发送短信它俩就是手机本身自带的两个app应用。

写到这里答案已经呼之欲出,上面打电话和发短信的实现代码大同小异,唯一的区别是传递的NSURL参数不一样,导致他们跳转到不同的应用场景。我们再仔细分析下传给它们的NSURL参数,就会发现NSURL的scheme(协议)不一样,打电话时“tel://”协议,发短信是“sms://”协议。(对协议有疑问的童鞋可以拉上去看)

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

三、实现两个app间的跳转

创建两个示例Demo,TestDemo和Test2Demo,现在需要实现从Test2Demo跳转到TestDemo中

1、在被跳转的TestDemo配置一个协议scheme,这里命名为test(名字可随意配置,当然最好是英文并且跟你项目相关)

targets -> info -> URL Types ->URL Scheme ->填写协议

注意:不需要填写成“test://”

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

-(void)touchesBegan:(NSSet *)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字段,把它设置为数组类型,并配置需要跳转的协议名单

配置协议白名单

到此,两个应用间的跳转已经完全实现,其实说穿了就三步,so easy!但是,很多时候,我不仅要跳转到一个应用上,而且还需要跳转到应用的指定界面,想知道怎么处理请接着往下看。

四、跳转到指定界面

想要跳转到指定界面,必然是上一个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]) {

[[UIApplication sharedApplication] openURL:url];

}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过来

//注:下面这个方法9.0后就过期了,请注意适配,9.0后用这个方法:application:openURL:options:

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

NSLog(@"url:%@",url.absoluteString);

NSLog(@"host:%@",url.host);

if ([url.host isEqualToString:@"more"]) {

NSLog(@"进入更多界面");

//到此做界面的跳转

}

if ([url.host isEqualToString:@"set"]) {

NSLog(@"进入设置界面");

//到此做界面的跳转

}

return YES;

}

当Test2Demo点击进入更多界面打印如下:

2016-12-02 17:11:17.680 TestDemo[6507:495044] url:test://more

2016-12-02 17:11:17.681 TestDemo[6507:495044] host:more

2016-12-02 17:11:17.681 TestDemo[6507:495044] 进入更多界面

当Test2Demo点击进入设置界面打印如下:

2016-12-02 17:10:38.745 TestDemo[6507:495044] url:test://set

2016-12-02 17:10:38.745 TestDemo[6507:495044] host:set

2016-12-02 17:10:38.745 TestDemo[6507:495044] 进入设置界面

iOS应用之间的跳转的更多相关文章

  1. iOS界面之间的跳转方式

    iOS界面之间的跳转方式基本有3种. .改变window的根视图 [self.window setRootViewController:VC]; .模态弹出 [self presentViewCont ...

  2. iOS APP之间到跳转,以及热门应用,手机自带到应用跳转

    应用之间的跳转 在第一个APP中,做如下操作:1.在info.plist文件中的"信息属性列表"下添加一项:"URL类型"; 2.点开"URL类型&q ...

  3. iOS应用之间的跳转与数据传递

    在开发的时候遇到需要从其他APP调用自己的APP的需求,比如从Safari中打开APP,并且传递一些信息的需要 1.首先设置自己的URL types 打开项目中的工程文件,打开info选项,在下面的U ...

  4. IOS 页面之间的跳转

    1.UINavigationController popToViewController 对应popViewControllerAnimated: 也可以使用: [self.navigationCon ...

  5. iOS应用之间跳转

    本篇博文将涉及到以下知识点: app应用跳转的原理解析 如何实现两个app应用之间的跳转 如何实现两个app之间跳转到指定界面 二.应用跳转原理 相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫 ...

  6. iOS开发拓展篇—应用之间的跳转和数据传递

    iOS开发拓展篇—应用之间的跳转和数据传 说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够 ...

  7. ios 应用程序之间的跳转(内置程序的实现)

    ios 应用程序之间的跳转(内置程序的实现) 一个程序若要跳到另一个程序.需要在目标程序的plist文件里面修改: 打开info.plist,添加一项URL types 展开URLtypes,再展开I ...

  8. iOS开发-应用之间的跳转及通信

    Update 2016-08-12: 在Github的Demo上增加Mac自定义Url Scheme,可以在Safari上输入特定协议头打开应用,并传递参数) 简介 我们接下来将要实现应用程序之间的跳 ...

  9. iOS App之间跳转

    1.先来看看效果,这里做了三个功能 从MyApp跳转到YourApp 从MyApp跳转到YourApp的指定页面 从YourApp使用跳转url的方式跳回MyApp 2.实现app之间的跳转需要注意两 ...

随机推荐

  1. Android adb你真的会用吗?

    引言 本文基于Android官方文档, 以及个人工作的使用经验, 总结下adb的常用用法, 备忘. 1, adb简介 adb全名Andorid Debug Bridge. 顾名思义, 这是一个Debu ...

  2. 转:EM算法总结

    https://applenob.github.io/em.html EM算法总结 在概率模型中,最常用的模型参数估计方法应该就是最大似然法. EM算法本质上也是最大似然,它是针对模型中存在隐变量的情 ...

  3. 用于文本分类的RNN-Attention网络

    用于文本分类的RNN-Attention网络 https://blog.csdn.net/thriving_fcl/article/details/73381217 Attention机制在NLP上最 ...

  4. mysql的水平拆分和垂直拆分 (转)

    http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...

  5. 对象序列化与反序列化(二进制 byte[])

    .序列化 public static byte[] SerializeObject(object obj) { if (obj == null) return null; MemoryStream m ...

  6. ASP.NET压力测试

    本文导读:对于直接面对互联网用户的WEB应用,在开发设计的时候必须格外小心,因为谁也不知道在单位时间内WEB程序访问和运行的速度.所以,在程序设计完成以后,最后针对程序进行一些严格的甚至是苛刻的测试, ...

  7. PHP文件操作[总结]

    1.前言 工作中涉及到数据处理,后台需要用到PHP处理数据,之前没有接触过PHP,借此机会了解了一下PHP,PHP很方便,很灵活,编码很舒服,很喜欢用PHP处理后台数据.今天总结一下php文件操作,主 ...

  8. String escape/unescape into XML

    Is there any C# function which could be used to escape and un-escape a string, which could be used t ...

  9. 也谈OpenStack中的虚拟机HA

    OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目. 它的社区拥有超过130家企业及1350位开发人员,这些机构与个人都将OpenStack作为基础设施即服务(IaaS)资源的通 ...

  10. ORACLE 执行计划

    有关oracle 执行计划几个不错的连接 执行计划的一些概念介绍:http://database.51cto.com/art/200611/34273.htm执行计划的例子:http://www.or ...