概述

常见的涉及到应用程序之间的跳转场景,比如社交分享、支付宝、微信支付、链接跳转到应用。

在iOS中应用跳转的本质:打开一个应用只需要拿到对应应用的URL即可。

统一资源定位符

URL(统一资源定位符)的组成:协议头(scheme)+资源路径。

协议头:决定查找资源的的方式 比如 http:// 、https:// 、 file://

资源路径:path 路径

注意:一个有效的URL必须协议头,可以没有资源路径。也就是说我们只要知道一个应用的协议头就可以跳转到该应用。

默认一个iOS应用是没有URL的需要我们进行配置。

iOS实现应用程序跳转

第一步需要给被跳转应用配置URL。其它的应用才能通过该URL跳转到该应用。在TARGETS->Info->URL Types配置URL,可以只配置协议头。

如果别的应用跳转到该应用可以通过UIApplication的openURL:方法进行跳转

UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"wechat://"];
if ([application canOpenURL:url]) {
[application openURL:url];
}else{
NSLog(@"不能打开微信应用");
}

同时我们也可以通过点击链接的方式打开该应用,比如在Safari浏览器输入wechat://也可以跳转。

通过上面的配置加代码实现跳转还是不够的,在跳转时控制台会输出

原因:iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。

例如:如果是应用A应用想跳转到B应用,需要在A应用的“Info.plist”将B应用的URL Schemes列为白名单。

        <key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
</array>

这样就可以实现应用程序之间的跳转了。

iOS实现应用程序跳转指定页面

我们在App分享场景,可以分享到微信好友与微信朋友圈。这个就需要设计跳转应用指定的页面。这里需要用到UIApplication的代理方法。

目前已经有三代理方法,当应用是被其它应用共通过openURL方法打开回来到回调方法,前两个已经过期。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options

根据URL资源路径携带参数做判断

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
NSString *urlString = url.absoluteString;
NSLog(@"urlStr=%@", urlString); UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
// 1.首先让导航控制器pop所有栈中的控制器 解决多次跳转出现上次push的页面没有pop 再一次push出现需要多次返回问题
[rootNav popToRootViewControllerAnimated:NO]; UIViewController *rootVC = [rootNav childViewControllers].firstObject; if ([urlString containsString:@"timeline"]) {
[rootVC performSegueWithIdentifier:@"HomeToTimeline" sender:nil];
NSLog(@"跳转到朋友圈");
}else if ([urlString containsString:@"session"]){
[rootVC performSegueWithIdentifier:@"HomeToSession" sender:nil];
NSLog(@"跳转到微信好友");
} return YES;
}

iOS开发系列-应用程序之间跳转的更多相关文章

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

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

  2. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  3. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  4. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  5. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  6. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  7. iOS开发系列--C语言之基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...

  8. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  9. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

随机推荐

  1. Dubbo入门到精通学习笔记(四):持续集成管理平台之Maven私有库和本地库的安装与配置

    文章目录 介绍 Maven私有库和本地库的安装与配置 Nexus安装 Nexus 配置(登录后) 介绍 如果构建的Maven项目本地仓库没有对应的依赖包,那么就会去Nexus私服去下载, 那么如果Ne ...

  2. Java 自动检测文本文件编码

    private String guessCharset(InputStream is) throws IOException { return new TikaEncodingDetector().g ...

  3. js 万能判断

    console.log(Object.prototype.toString.call(123)) //[object Number] console.log(Object.prototype.toSt ...

  4. createBottomTabNavigator: 怎么在切换tab的时候让页面重新渲染

    1.import withNavigationFocus from react-navigation to your class . 2.hen export your like this : exp ...

  5. angularJs input框绑定ng-model后js获取不到问题

    搬运自:https://blog.csdn.net/fenglongmiao/article/details/81545993 与其他指令一样,ng-controller指令也会创建一个子级作用域,因 ...

  6. Pregel的执行过程

  7. webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)

    1.ajax报500,4的错误,然而多次验证自己的后台方法没错.然后跟踪到如下图的错误信息! 2.因为两个函数都是无参的,返回值也一样.如下图 3,我给第一个函数加了一个参数后,就不报错了,所以我想, ...

  8. php导出csv并保存在服务器,返回csv的文件路径

    <?php namespace app\common\controller; use think\Controller; use think\Db; class Csv extends Cont ...

  9. Java SE(2)

    1.this的两种用法:(1)当成员变量和局部变量重名是,可以用关键字this来区分 .this代表对象,代表的是this所在函数所属对象的引用(哪个对象调用了this所在的函数,this就代表哪个对 ...

  10. 日文NLP分词系统

    mecab(http://mecab.sourceforge.net/)是奈良先端科技大学开发的日文分词系统,基于CRF的分词原理,有c++实现,提供python.perl.ruby等接口 日文NLP ...