iOS开发-应用之间的跳转及通信
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开发-应用之间的跳转及通信的更多相关文章
- ios 应用程序之间的跳转(内置程序的实现)
ios 应用程序之间的跳转(内置程序的实现) 一个程序若要跳到另一个程序.需要在目标程序的plist文件里面修改: 打开info.plist,添加一项URL types 展开URLtypes,再展开I ...
- iOS开发控制器之间传值的几种小方法
在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...
- iOS中两个APP之间的跳转和通信
app间的跳转 一:在第一个app首先要做下面这些操作: 1.在info.plist文件中的Information Property List下添加一项:URL types. 2.点开URL type ...
- 微信小程序开发--页面之间的跳转
一.navigator--完成页面之间的跳转 1.新建一个页面文件夹 2.在app.json文件中引入页面 "pages": [ "pages/index/index&q ...
- iOS开发多线程篇 04 —线程间的通信
iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...
- iOS之开发程序之间的跳转及跳转到appStore
实例一:A程序跳转到B程序 第一步: 在B程序plist文件中,注册对外接口如图在B程序中找到info.plist点击,找到Information Property List ,右击 添加列表项 找到 ...
- iOS开发——消息推送跳转
项目开发用集成是极光推送JPush 这里主要是消息推送过来处理对应界面跳转 同时看到两篇写的不错的相关博客分享一下: http://www.jianshu.com/ ...
- iOS开发,应用间的跳转
预习:URL由两部分组成-- 1.scheme:协议头(http:// ftp:// 等等) 2.path:路径(URL中path可以没有) 一.简单实现跳转到指定APP(也就是说跳转到的APP必须 ...
- IOS开发,知识点小结,ios开发中经常使用的宏定义总结
IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:// ...
随机推荐
- git用法资料
上网看到一篇不错的GIT教程,与大家共享(图片上传实在太麻烦),请见具体地址: http://www.liaoxuefeng.com/wiki/0013739516305929606dd1836124 ...
- Mahout学习之Mahout简单介绍、安装、配置、入门程序測试
一.Mahout简单介绍 查了Mahout的中文意思--驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的 ...
- Simple Addition Permits Voltage Control Of DC-DC Converter's Output
http://electronicdesign.com/power/simple-addition-permits-voltage-control-dc-dc-converters-output In ...
- Spring内部bean实例
在Spring框架中,一个bean仅用于一个特定的属性,这是提醒其声明为一个内部bean.内部bean支持setter注入“property”和构造器注入"constructor-arg“. ...
- java socket 长连接 短连接
长连接 是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不管他们之间进行了多少次交易,直到客户端退出登陆或网络出现故障.这种技术在联机交易系统实现有利于提高效率. 短连接是客户端每发一个请 ...
- 配置Android-Annotation (github20大开源:http://www.eoeandroid.com/thread-278980-1-1.html)
1. 把androidannotations-X.X.X-api.jar 放在libs文件夹 2. 把androidannotations-X.X.X.jar 放在文件夹compile-libs,1与 ...
- android RecyclerView (二) ItemDecoration 详解
RecyclerView 已经推出了一年多了,日常开发中也已经彻底从 ListView 迁移到了 RecyclerView,但前两天有人在一个安卓群里面问了个关于最顶上的 item view 加蒙层的 ...
- TCP常用网络和木马使用端口对照表,常用和不常用端口一览表
[开始-运行- CMD , 输入 netstat -an 然后回车就可以查看端口] 端口: 服务:Reserved 说明:通常用于分析操作系统.这一方法能够工作是因为在一些系统中“”是无效端口,当你试 ...
- Spring Bean 注入 2 注解篇
1. 自动装配注解 配置applicationContext.xml开启注解 <?xml version="1.0" encoding="UTF-8"?& ...
- 盗COOKIE之方法总结
1.xss跨站盗cookie 2.ajax跨域盗cookie 3.hosts文件映射 对于第一种方法,首先:在有跨站漏洞的页面贴上跨站代码如: <script>window.open('h ...