【原】iOS学习之应用之间的操作_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 【原】iOS学习之应用之间的操作

【原】iOS学习之应用之间的操作

 2016/9/30 5:33:54  孤非  程序员俱乐部  我要评论(0)
  • 摘要:关于应用之间的相互操作,小编一直觉得非常高大上,在一次面试中被面试官一顿暴虐,今天小编就决定学习一下!经过一顿度娘,找到一些博客,不过都比较凌乱,我就打算自己整理一下!首先要说的是每一个APP都可以设置一个自己独有的URL,APP应用之间的操作就是通过这个URL来实现的!1、如何配置自己应用的URL?关于自己的URL,作为资深的程序猿都会想到Info.plist,在Info.plist中如下图配置:2、APP中判断手机上是否存在另一个APP核心方法
  • 标签:学习 iOS 应用 操作

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

首先要说的是每一个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谢谢!

发表评论
用户名: 匿名