关于应用之间的相互操作,小编一直觉得非常高大上,在一次面试中被面试官一顿暴虐,今天小编就决定学习一下!经过一顿度娘,找到一些博客,不过都比较凌乱,我就打算自己整理一下!

首先要说的是每一个APP都可以设置一个自己独有的URL,APP应用之间的操作就是通过这个URL来实现的!

1、如何配置自己应用的URL?

关于自己的URL,作为资深的程序猿都会想到 Info.plist ,在 Info.plist 中如下图配置:

2、APP中判断手机上是否存在另一个APP

核心方法:

[[UIApplication sharedApplication] canOpenURL:url];

该方法的实质就是检测当前你的APP是否可以打开对应URL的APP,如果可以打开说明你手机中装有这个APP,反之打不开就没有这个APP。

这样我们可以通过这个方法先检测后跳转到我们需要跳的应用,例如:我们可以在自己的APP中检测手机上已有的地图导航,有选择的展示和进行跳转。

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) { // 判断是否存在高德地图
// 配置高德地图导航所需要的参数
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
NSString *appUrlScheme = @"Myapp://"; //TODO
NSString *urlString = [NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&poiname=%@&lat=%f&lon=%f&dev=0&style=2", appName,appUrlScheme, station.name,endCoor.latitude, endCoor.longitude]; NSDictionary *dic = @{@"name": @"使用高德地图导航", @"url": urlString};
[self.availableMaps addObject:dic];
}
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://map/"]]) { // 判断是否存在百度地图
// 配置百度地图导航所需要的参数
CLLocationCoordinate2D begin = [YDCoordinateConverter transform:startCoor];
NSString *urlString = [NSString stringWithFormat:@"baidumap://map/direction?origin=latlng:%f,%f|name:我的位置&destination=latlng:%f,%f|name:%@&mode=driving&coord_type=gcj02", begin.latitude, begin.longitude, endCoor.latitude, endCoor.longitude, station.name]; NSDictionary *dic = @{@"name": @"使用百度地图导航", @"url": urlString};
[self.availableMaps addObject:dic];
}
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://map/"]]) { // 判断是否存在腾讯地图
// 配置腾讯地图导航所需要的参数
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appName = [infoDictionary objectForKey:@"CFBundleDisplayName"]; NSString *format = @"qqmap://map/routeplan?type=drive&fromcoord=%f, %f&tocoord=%f,%f&coord_type=2&policy=0&refer=%@"; NSString *urlString = [NSString stringWithFormat:format, startCoor.latitude, startCoor.longitude, endCoor.latitude, endCoor.longitude, appName]; NSDictionary *dic = @{@"name": @"使用腾讯地图导航", @"url": urlString};
[self.availableMaps addObject:dic];
}

以上代码是判断对应的地图APP并配置导航所需要的参数,拼接成URL,下面就为大家介绍这个URL如何使用!

3、APP之间的跳转及参数传递

核心方法:

[[UIApplication sharedApplication] openURL:url];

这里的URL就是上述代码中的URL,我针对一个URL进行分析一下

qqmap://map/routeplan?type=drive&fromcoord=%f, %f&tocoord=%f,%f&coord_type=2&policy=0&refer=%@

上面的URL中,qqmap://map/ 为腾讯地图APP的 URL Scheme 

如果在不传参数的情况下,跳转代码如下:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"qqmap://map/"]];

至于qqmap://map/后面的部分为我们要传递的参数,也就是说,我们要传递什么参数就直接将参数拼接到URL上面就可以!

代码如下:(接上面选择地图APP)

NSDictionary *mapDic = self.availableMaps[index];
NSString *urlString = mapDic[@"url"];
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];

4、接受参数并处理

在我们跳转到的APP里都应该实现一个方法,通过这个方法对接收到的参数进行处理

核心方法:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// 处理接收到的URL
...
return YES;
}

这个方法从URL中分割出对应的参数并进行处理!

以上就是小编总结的一些关于应用之间的操作,有什么不足,请及时提出,O(∩_∩)O谢谢!

【原】iOS学习之应用之间的操作的更多相关文章

  1. iOS学习之应用之间的操作(转发)

    首先要说的是每一个APP都可以设置一个自己独有的URL,APP应用之间的操作就是通过这个URL来实现的! 1.如何配置自己应用的URL? 关于自己的URL,作为资深的程序猿都会想到 Info.plis ...

  2. iOS学习之页面之间传值的方式总结

    传值三种场景: 1.属性传值(从前往后传) 需求:第二个界面标签显示第一个界面输入框文字. 第一步, 在前一个界面定义属性. (语义属性声明为copy); 第二步, 在进入下一个界面之前,给属性传入数 ...

  3. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  4. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  5. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  6. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  7. IOS学习之IOS沙盒(sandbox)机制和文件操作

    IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...

  8. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  9. iOS学习之UITableView中Cell的操作

    接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...

随机推荐

  1. jsp 头像上传显示部分代码实现

    <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <% ...

  2. 搭建consul 集群

    1.   准备工作 a)      启动三台虚拟机 s1:10.1.7.141 s2:10.1.7.139 s3:10.1.7.138 b)      每台机器上在 /home新建文件夹 mkdir ...

  3. CI加载model的问题

    1.需求 CI在linux上无法加载model 2.原因 因为linux区分大小写,且model文件名首字符要大写. As said in the comments : Your model's fi ...

  4. JS函数运行在它们被定义的作用域内,而不是它们被执行的作用域内

    一个函数的作用域并不会因为被另一个函数调用而拓展,取得另一个函数的作用域: function show(name){ alert(name) } function show2(){ var name= ...

  5. IIS网站或系统验证码不显示问题——"使用了托管的处理程序,但是未安装或未完整安装 ASP.NET"

    在IIS上发布了一个系统,但是登陆页面的验证码图片一直出不来,尝试了各种办法,权限.路径.继承父类路径等都不管用,进入Login.html,对着无验证码图片的图标,右键复制图片的网址,粘贴到地址栏,出 ...

  6. docker 目录迁移

    (ubuntu 12.04) 默认路径 /var/lib/docker  --> /data/docker root@node1:~# service docker stop root@node ...

  7. 配置VMware虚拟机用绕过校园网达到无线上网配置方法

    因为平时要用到Vmware这样的工具上虚拟机上网, 但是本人是学生狗,学生狗在学校就要面对大学毒瘤软件--锐捷,而锐捷是不允许有虚拟网卡的存在的,所以上网只能用wifi上.之前试了很久,反正是怎么开都 ...

  8. RecyclerView解密篇(一)

    一.前言 RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视 ...

  9. asp.net 读取导入的project(mpp)文件

    公司项目有用到读取project文件(.mpp)并保存到指定数据库类似的功能. 查了一下大家总结的方法. 找到一哥们代码,初步判断可行,特此收藏. using System.IO; using Mic ...

  10. pycharm上安装使用easygui

    运行下面两句后,显示错误 import easygui easygui.msgbox("Hello There!") 错误: Traceback (most recent call ...