文档章节

iOS App 之间的相互跳转

木木情深
 木木情深
发布于 2015/06/17 15:13
字数 1477
阅读 43
收藏 0
点赞 0
评论 1

不久前公司有个项目需要从我们自己的 Application 跳转到系统WIFI设置界面。google一番后发现一个问题,iOS 在 5.0 版本中开放了 APP 对 System Settings 的链接,开发者可以通过自己的方法实现对 Settings 的定向跳转,代码如下:


NSURL *url=[NSURL URLWithString:@"prefs:root=WIFI"];

[[UIApplication sharedApplication] openURL:url];

不过遗憾的是,Apple 在 5.1 版本中又取消了这一支持。所以目前在项目中添加上述代码,APP 并不会有任何动作(为了考虑简便开发,我们将不再支持 iOS 7.0 以下版本,乔布斯时代总会终结的)。于是本以为这个功能无法实现,但是在使用某些著名的 APP 时发现,它们之中有的确可以从应用程序内跳转到系统设置页,当时就想,shit! 怎么搞的?但是苦于个人技术水平原因,一直弄不清所以然,所以这个问题一直放着,直到昨天整了下 App 和 App 之间的相互跳转,似乎心里有了些眉目。在解决这个问题之前,先看看 App 和 App 互跳是如何实现的。


App 跳转到 App


iOS 允许将你的 App 和一个自定义的 URL Scheme 进行绑定,通过该 URL Scheme,你的应用程序可以被浏览器或者其他应用启动,也就是说我们可以在 App1 中通过某个事件响应跳转到 App2。


允许其他应用程序唤起的你的 App,给自己的应用注册一个 URL type 是必要的,这是其他程序跳转过来的入口。这里举例说明,你需要在项目 App1 设置的info->URL Types中添加一个新项,URL Scheme 随便取名为 App1:


pic


编译运行以后,你会发现什么都没有发生。的确,这些改动对你的应用程序本身并没有什么可见的影响,但是如果你在 Safari 中的地址栏里输入App1://回车之后,浏览器便切回到了 App1。


gif


如果浏览器提示Open this page in "App1"这个是正常的,这个出现的时机不确定,允许就好。


一些网站的二维码下载就是居于这样的原理,扫码以后如果终端没有安装它的应用程序则跳转到 App Store 相关页面,否则直接打开 App。


但是光打开 App 还不够,更多的时候我们希望打开 App 以后跳转到另一个界面里去完成我们想要做得事情,这就需要在跳转的同时把相关的参数也一并传输过来。从上面的动图结合 URL Scheme不难看出应用程序之间传递信息正是依靠 URL 地址进行的。通过 GET 方法提交一个请求,如果待唤醒 App 成功响应了提交的请求,则系统会把这个 App 唤醒送回前台供用户操作,于是可以使用一些自定义的 URL Scheme 传输数据:


App1://test?parameter=hello

App1://?parameter=hello

App1://?hello

上面的这些都是可以的,格式可以按需定义,这个是很自由的,只要能把参数解得出来,随你怎么搞。


既然有了数据的发送者,那自然有数据的接受者。iOS 早期版本提供了

optional func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool函数用来处理来自其他应用程序的 URL 请求。因此我们可以在这个函数中响应这些请求。但是在这个函数的声明文件中有这么一行注释:


Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:


Apple 官方不建议我们使用这个函数,它随时可能被 deprecated,于是我们还有另一个替代方案:

optional func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool。


参数 说明

application 应用程序实例

openURL 传递过来的 URL

sourceApplication 发出请求的应用程序的 Bundle ID

annotation 这个参数貌似很牛逼,不过测试几番后仍不知具体有何作用。

retutnValue 处理成功返回 true, 失败或者没处理返回 false.



在这个方法里我用一个 UIAlertView 来展示信息:


1 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {

2     var parameter = url.query

3     var alert = UIAlertView(title: sourceApplication!, message: parameter, delegate: nil, cancelButtonTitle: "OK")

4     alert.show()    

5     return true

6 }

gif




再来看看从 App2 如何跳转到 App1,根据上面的思路,只要在 App2 中发送一个 URL 请求即可。在我的 Storyboard 中有一个 button 和一个 test field 用来发送文本框中得数据,然后在按钮的touchUpInside事件中实现主要代码:


1 @IBAction func btnOnClick(sender: UIButton) {

2     if UIApplication.sharedApplication().canOpenURL(NSURL(string: "App1://")!){

3         var str = String(format: "App1://?%@", msgField.text)

4         str = str.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

5         UIApplication.sharedApplication().openURL(NSURL(string: str)!)

6     }

7 }

gif


跳转到系统设置页


上面谈论的都是 用户的 App 之间的跳转,那么 App 跳转到系统设置页该如何去做,毕竟之前的那些方案已经被弃用。prefs这个 Scheme 想必是被 Apple 动过了,但是如果你在自己的应用程序里再弄一个 URL Scheme 取名为prefs,那么这段代码便活了过来:


png


 1 class ViewController: UIViewController {

 2     private var arr :[String] = []

 3 

 4     override func viewDidLoad() {

 5         super.viewDidLoad()

 6         // Do any additional setup after loading the view, typically from a nib.

 7         arr.append("")

 8         arr.append("prefs:root=WIFI")

 9         arr.append("prefs:root=Bluetooth")

10         arr.append("prefs:root=General")

11         arr.append("prefs:root=General&path=About")

12         arr.append("prefs:root=Phone")

13     }

14 

15     override func didReceiveMemoryWarning() {

16         super.didReceiveMemoryWarning()

17         // Dispose of any resources that can be recreated.

18     }

19 

20     @IBAction func execAction(sender: UIButton) {

21         UIApplication.sharedApplication().openURL(NSURL(string: arr[sender.tag])!)

22     }

23 

24 }

gif


另外 iOS 8 提供了一个方案

UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)用来跳转到设置页。所以不到万不得已,尽量还是使用这种方式。


© 著作权归作者所有

共有 人打赏支持
木木情深
粉丝 37
博文 186
码字总数 26451
作品 0
广州
程序员
加载中

评论(1)

APP或网站/微信【注册决定成败】市场调查分析:目前80%的用户是因为注册短信验证码体验不佳,从而放弃注册!这是多么痛的领悟-----我公司是专业做短信验证码的供应商,6年间我们只做了一件事让每个用户注册短信验证码5秒到达,为近16000APP客户提供服务! 加我微-信: wkk-555 咨询,〔廖经理136-4173-0373〕!
RN与原生交互(一)——基本页面跳转

React Native(以下简称RN)开发app过程中大部分都可以在JS端完成,但是也有一些功能是需要原生端来完成的。这时RN与原生端就不可避免的需要进行交互,比如页面跳转和数据传递。本篇文章主要以...

不變旋律 ⋅ 06/13 ⋅ 0

iOS一些代码的取巧写法总结(一)

一、 字典(NSDictionary)和JSON字符串(NSString)之间互转 二、打开摄像机作为背景 三、打开背光灯 四、状态栏和导航栏一些设置 五、切回app时、会有闪现、闪现一次主屏幕的现象 六、[UIAppl...

朝雨晚风 ⋅ 2016/12/05 ⋅ 0

Ionic3 应用跳转高德地图 APP

首先检测我们的 Ionic3 应用是否安装高德地图 APP,如果安装则打开该APP。 介绍 App Availability 插件 Ionic Native 官方文档提供的插件,此插件用来检查用户设备上是否已安装指定的 APP。 ...

与蟒唯舞 ⋅ 05/15 ⋅ 0

目前有成熟的App代码翻译技术吗?

大家好: 本人多年技术老鸟,现有抛出一个思考。针对目前市面上的移动互联网项目(主要指客户端)类型,无非以下几种主要类型: 原生App: iOS/Android H5响应式 H5套壳(PhoneGap/微信小程序/国...

瑾少 ⋅ 04/14 ⋅ 0

微信小程序唤起其他微信小程序 / 移动应用App唤起小程序

1. 微信小程序唤起微信小程序 小程序唤起其他小程序很简单 先上链接 小程序跳转小程序 Navigator组件 推荐使用 小程序跳转小程序 wx.navigateToMiniProgram(OBJECT) API 即将废弃 不推荐使用...

一个程序猿的每一天 ⋅ 05/30 ⋅ 0

挖掘安卓宝藏,EMUI会让手机进入“量心定制”时代吗?

如果把移动终端的发展历程看做一部戏剧,那么Android和iOS两种操作系统生态之间的竞争一定是最精彩的一折。 从市场占有率来看,2017年Android手机在全球售出的手机中占据了85.9%份额,其中自...

脑极体 ⋅ 04/17 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

iOS最火那年转型管理,他收获了什么?

过去一年,移动端开发者就业环境爆冷。一些迷茫的程序员,通过转岗甚至转行的方式,暂时告别自己的移动开发路。 提到转型,作为国内最早的一批 iOS 开发者,唐巧相当有发言权。工作八年,他恰...

100offer ⋅ 04/13 ⋅ 0

我们可以利用 NSURLProtocol 做什么

本文是我首发在iOS知识小集团队的,欢迎关注微博话题#ios知识小集#。 今天和大家聊一聊 NSURLProtocol,可能你已经听说过它。因篇幅有限,这里不讲解具体的使用方式,主要是和大家聊一聊我们...

halohily ⋅ 04/22 ⋅ 0

iOS小白点效果、打地鼠游戏、轮播效果、画板、富文本编辑器等源码

iOS精选源码 美团外卖商家点菜页面(http://www.code4app.com/thread-29383-1-1.html) 板书录制演示程序(http://www.code4app.com/thread-29384-1-1.html) 分类轮播、直播间礼物列表轮播 -- O...

sunnyaigd ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部