Update

2016-08-12: 在Github的Demo上增加Mac自定义Url Scheme,可以在Safari上输入特定协议头打开应用,并传递参数)

简介

我们接下来将要实现应用程序之间的跳转及通讯。现在手机开发中,很多时候我们都需要在应用内跳转到别的应用中,这个是很常见的。

为此,我们首先需要准备两个项目ApplicationOne和ApplicationTwo。(下载项目源码)

应用间的简单跳转

在ApplicationOne应用跳转到ApplicationTwo应用

我们需要先创建在ApplicationTwo项目里设置URL Types协议,这里我设置为GC,如下所示

在ApplicationOne应用添加事件

@IBAction func openApplication() {
// 1
let urlSting = "GC://"
// 2
if let url = NSURL(string: urlSting) {
// 3
let application = UIApplication.sharedApplication()
// 4
if application.canOpenURL(url) {
// 5
application.openURL(url)
}
}
}
  • 1: 创建urlString字符串
  • 2: 利用urlString字符串创建真正的url,并检测url是否有用
  • 3: 获得UIApplication实例
  • 4: 检测是否能够打开此url
  • 5: 打开url,在这里即为我们的应用跳转

需要注意的是,协议开头必须要是完整的,即为****://

应用间的传值跳转

实现方式很简单,我们只需要在url协议里补充参数就可以了,比如我现在传一个字符串GarveyCalvin

现在事件的代码是这样的

@IBAction func openApplication() {
let urlSting = "GC://GarveyCalvin"
if let url = NSURL(string: urlSting) {
let application = UIApplication.sharedApplication()
if application.canOpenURL(url) {
application.openURL(url)
}
}
}

你可以在协议后补充n个参数,只需要双方都能解析得到就行,具体的协议规则自行商议

然后在ApplicationTwo应用的AppDelegate文件,我们需要实现如下方法去接收其它应用传进来的参数

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
let newUrlHost: NSString = url.absoluteString ?? ""
let range = newUrlHost.rangeOfString("//") if range.length != NSNotFound {
let params = newUrlHost.substringFromIndex(range.length)
UIAlertView(title: "params is \(params)", message: nil, delegate: nil, cancelButtonTitle: "Confirm").show()
} else {
UIAlertView(title: "haven't params", message: nil, delegate: nil, cancelButtonTitle: "Confirm").show()
} return false
}

应用间的反向跳转

我们要实现的是,从ApplicationOne跳转到ApplicationTwo应用,再从ApplicationTwo跳转回ApplicationOne应用里。

具体的实现步骤如下:

  • 我们需要在ApplicationOne项目中添加URL Types协议,具体看文章的上方,我们刚刚才做过。
  • 为了实现应用间的反转跳转,我们必须让ApplicationTwo应用知道是从哪里跳转的,因此我们可以在ApplicationOne 的url跳转事件把自身的URL Types协议传递给ApplicationTwo应用。像这样GC://GarveyCalvin&GCFirst
  • 这样我们就能在ApplicationTwo应用的application(_:openURL: sourceApplication:annotation:)方法中获取到ApplicationOne的协议,我们保存它,等到需要反向跳转的时候就可以使用它来进行跳转了。

适配iOS9

有一位git友提醒了我,在iOS9下运行报以下错误(issue):

-canOpenURL: failed for URL: "GC://GarveyCalvin&GCFirst" - error: "This app is not allowed to query for scheme GC"

这是因为在iOS9中,苹果做了严格的限制,我们想要调起这个url,必须要手动添加白名单,这样苹果才会"放行"。我们需要在info.plist里添加

<key>LSApplicationQueriesSchemes</key>
<array>
<string>GC</string>
</array>

LSApplicationQueriesSchemes是一个数组,用于存放url白名单

Download

你们可以通过这个Git的链接去下载本文章所使用的完整项目源码。(ApplicationJumpAndSentValue).

参考文章


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

iOS应用程序开发之应用间的跳转

在Mac和iOS中注册自定义的URL Scheme

博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

iOS开发-应用之间的跳转及通信的更多相关文章

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

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

  2. iOS开发控制器之间传值的几种小方法

    在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...

  3. iOS中两个APP之间的跳转和通信

    app间的跳转 一:在第一个app首先要做下面这些操作: 1.在info.plist文件中的Information Property List下添加一项:URL types. 2.点开URL type ...

  4. 微信小程序开发--页面之间的跳转

    一.navigator--完成页面之间的跳转 1.新建一个页面文件夹 2.在app.json文件中引入页面 "pages": [ "pages/index/index&q ...

  5. iOS开发多线程篇 04 —线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

  6. iOS之开发程序之间的跳转及跳转到appStore

    实例一:A程序跳转到B程序 第一步: 在B程序plist文件中,注册对外接口如图在B程序中找到info.plist点击,找到Information Property List ,右击 添加列表项 找到 ...

  7. iOS开发——消息推送跳转

    项目开发用集成是极光推送JPush     这里主要是消息推送过来处理对应界面跳转          同时看到两篇写的不错的相关博客分享一下:      http://www.jianshu.com/ ...

  8. iOS开发,应用间的跳转

    预习:URL由两部分组成-- 1.scheme:协议头(http://  ftp:// 等等) 2.path:路径(URL中path可以没有) 一.简单实现跳转到指定APP(也就是说跳转到的APP必须 ...

  9. IOS开发,知识点小结,ios开发中经常使用的宏定义总结

    IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:// ...

随机推荐

  1. HDU 5671 Matrix 水题

    Matrix 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5671 Description There is a matrix M that has ...

  2. hihocoder1320 160周 压缩字符串

    hihocoder1320 题目链接 思路: dp解法.用map[i][j]表示从第i个开始到第j个的字串的best压缩长度.(包括i,j,两端闭合). 用k表示i,j中的一点. 用zip()表示压缩 ...

  3. reservoid sample 蓄水池问题

    题目:怎样从无穷尽流中等概率的抽样出一个单词? 也许我们换一种说法会更加easy理解.等概率的抽取出一个单词,也即随机的抽取一个单词. 本体的难点在于没有给定单词数,而是一个无尽的流. 这个问题能够用 ...

  4. Spring过滤器组件自动扫描

    在这个Spring自动组件扫描的教程,您已经了解如何使Spring自动扫描您的组件.在这篇文章中,我们将展示如何使用组件过滤器自动扫描过程. 1.过滤组件 - 包含 参见下面的例子中使用Spring  ...

  5. 小道消息:CSDN社区产品重大更新

    Hi,小伙伴们: 悄悄给大家透露个消息:CSDN社区将要有重大更新. 都有哪些呢?各自是:新极客头条.Ink.博乐 是不是后面两个比較眼生?不要着急,那但是我们的重中之重.我来给大家一一道来-- 先来 ...

  6. 关于OGRE与OSG的简单比较【转】

    关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...

  7. javascript常用技巧归纳

    最近归纳了下,发现还很多的哦1 javascript捕捉方向键  <HTML><HEAD><title>反选</title><script lan ...

  8. 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作

    这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...

  9. 用Sass创建MetaFizzy效果

    来源:GBin1.com Hugo发现了一个绚丽的css效果应用于web中并教会你如何聪明的重建和使用它.两天前,我看见笔者Hugo在css帮助下重写MetaFizzy的效果,Hugo帮助我们找到了一 ...

  10. data目录和binlog目录搬迁的方法

    刚开始安装时使用了默认目录,使用一段时间,数据慢慢变在,发现当前设置的目录空间不够时,就要搬迁数据到另一个目录了 如果全过程使用的是Mysql用户,应该可以正常启动. 如果用的ROOT用户,可能不能正 ...