LBS,即Location Based Services,基于位置服务,用于定位、导航等功能,比如地图应用、订外卖等的app就需要这个功能。

在这里我使用的是高德LBS开放平台,地址:http://lbs.amap.com/

进入网站,首先注册并认证为开发者,然后为你的每个APP申请一个key,其中安全码(Bundle Identifier)通过Xcode切换到General标签,查看Bundle Identifier。

使用第三方服务,我们可以使用自动配置,这里就要使用到Cocoapods。CocoaPods是一个用来帮助我们管理第三方依赖库的工具。它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我们的工程连接起来,供我们开发使用。使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。

如果需要升级ruby,使用homebrew安装:brew install ruby

另外一种方法升级ruby: sudo gem update --system

安装Cocoapods教程:

gem sources -l
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l
sudo gem install -n /usr/local/bin cocoapods
pod setup

创建Podfile:

cd /project
touch Podfile

或者直接cd到工程目录,然后pod init ,在Podfile里直接添加也行。

编辑Podfile文件:

source 'https://github.com/CocoaPods/Specs.git'
platform:ios,'7.0' #手机系统
#pod 'AMap3DMap' #3D地图SDK
pod 'AMap2DMap' #2D地图SDK(2D和3D不能同时使用)
pod 'AMapSearch' #搜索服务SDK 以下是额外补充
#platform :ios
#pod 'Reachability', '~> 3.0.0'
#pod 'SBJson', '~> 4.0.0' #platform :ios, '7.0'
#pod 'AFNetworking', '~> 2.0'

标准格式:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
target 'AlamofireDemo' do
pod 'Alamofire'
pod 'SwiftyJSON'
end

然后到工程目录,输入命令pod  install,如果出现-bash: pod: command not found,输入sudo gem install -n /usr/local/bin cocoapods即可解决。

如果如果pod update / pod install 卡在:Updating local specs repositories,

等待即可,或者可以使用 “pod install --verbose --no-repo-update” 进行下载。

更新:如果你又添加新的三方库,可以在Podfile文件中继续添加,然后再终端输入pod update,然后CocoaPods就会重新帮你导入.

然后通过打开xcworkspace文件打开安装有cocoapods的工程

以下是我Controller.m的核心代码,仅供参考:

#import "ViewController.h"
#import <MAMapKit/MAMapKit.h>
#import <AMapSearchKit/AMapSearchAPI.h>
#define APIKey @"你申请的key" @interface ViewController ()<MAMapViewDelegate,AMapSearchDelegate>
{
MAMapView *_mapView;
AMapSearchAPI *_search;
CLLocation *_currentLocation;
UIButton *_locationButton;
} @end @implementation ViewController - (void)initControls
{
_locationButton = [UIButton buttonWithType:UIButtonTypeCustom];
_locationButton.frame = CGRectMake(, CGRectGetHeight(_mapView.bounds)-,,);
_locationButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
_locationButton.backgroundColor = [UIColor whiteColor];
_locationButton.layer.cornerRadius = ;
[_locationButton addTarget:self action:@selector(locateAction) forControlEvents:UIControlEventTouchUpInside];
[_locationButton setImage:[UIImage imageNamed:@"location_no"] forState:UIControlStateNormal];
[_mapView addSubview:_locationButton]; }
//搜索服务
- (void)initSearch
{
_search = [[AMapSearchAPI alloc]initWithSearchKey:APIKey Delegate:self];
} //修改用户定位模式
- (void)locateAction
{
if (_mapView.userTrackingMode != MAUserTrackingModeFollow) {
[_mapView setUserTrackingMode:MAUserTrackingModeFollow animated:YES];
}
}
//地理编码搜索请求
- (void)reGeoAction
{
if(_currentLocation)
{
AMapReGeocodeSearchRequest *request = [[AMapReGeocodeSearchRequest alloc]init];
request.location = [AMapGeoPoint locationWithLatitude:_currentLocation.coordinate.latitude longitude:_currentLocation.coordinate.longitude];
[_search AMapGeocodeSearch:request];
}
} - (void)searchRequest:(id)request didFailWithError:(NSError *)error
{
NSLog(@"request :%@, error :%@",request,error);
}
- (void)onReGeocodeSearchDone:(AMapGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
{
NSLog(@"response :%@",response);
NSString *title = response.regeocode.addressComponent.city;
if (title.length == ) {
title = response.regeocode.addressComponent.province;
}
_mapView.userLocation.title = title;
_mapView.userLocation.subtitle = response.regeocode.formattedAddress;
} //用户代理方法
- (void)mapView:(MAMapView *)mapView didChangeUserTrackingMode:(MAUserTrackingMode)mode animated:(BOOL)animated
{
//修改定位按钮状态
if(mode == MAUserTrackingModeNone)
{
[_locationButton setImage:[UIImage imageNamed:@"location_no"] forState:UIControlStateNormal];
}
else{
[_locationButton setImage:[UIImage imageNamed:@"location_yes"] forState:UIControlStateNormal];
}
} //记录当前所在位置
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
NSLog(@"userLocation: %@",userLocation.location);
_currentLocation = [userLocation.location copy]; } - (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view
{
//选中定位annotation的时候进行逆地理编码查询
if ([view.annotation isKindOfClass:[MAUserLocation class]])
{
[self reGeoAction];
}
} //初始化地图
- (void)initMapView
{
[MAMapServices sharedServices].apiKey = APIKey;
_mapView = [[MAMapView alloc]initWithFrame:CGRectMake(, , CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
//设置地图的代理和两个附件的位置
_mapView.delegate = self;
_mapView.compassOrigin = CGPointMake(_mapView.compassOrigin.x, );
_mapView.scaleOrigin = CGPointMake(_mapView.scaleOrigin.x, );
[self.view addSubview:_mapView];
//打开用户定位
_mapView.showsUserLocation = YES; } - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initMapView];
[self initSearch];
[self initControls];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

运行结果:

如果你有更多的API接口想要实现,你可以去高德LBS开放平台去看看开发文档,可以作进一步深入和开发。

github地址:https://github.com/AbelSu131/HelloAmap

基于LBS平台的iOS开发的更多相关文章

  1. 基于 Koa平台Node.js开发的KoaHub.js的控制器,模型,帮助方法自动加载

    koahub-loader koahub-loader是基于 Koa平台Node.js开发的KoaHub.js的koahub-loader控制器,模型,帮助方法自动加载 koahub loader I ...

  2. 基于 Koa平台Node.js开发的KoaHub.js连接打印机的代码

    最近好多小伙伴都在做微信商城的项目,那就给大家分享一个基于 Koa.js 平台的 Node.js web 开发的框架连接微信易联云打印机接口的代码,供大家学习.koahub-yilianyun 微信易 ...

  3. 基于 Koa平台Node.js开发的KoaHub.js获取/设置会话功能代码

    koa-session2 Middleware for Koa2 to get/set session use with custom stores such as Redis or mongodb ...

  4. 基于 Koa平台Node.js开发的KoaHub.js的静态服务器重写和索引代码

    koa-static-server Static file serving middleware for koa with directory, rewrite and index support k ...

  5. 基于 Koa平台Node.js开发的KoaHub.js的模板引擎代码

    koahub-handlebars koahub-handlebars koahub handlebars templates Installation $ npm install koahub-ha ...

  6. 基于 Koa平台Node.js开发的KoaHub.js的输出json到页面代码

    koahub-body-res koahub body res Format koa's respond json. Installation $ npm install koahub-body-re ...

  7. 基于 Koa平台Node.js开发的KoaHub.js的跳过组件代码

    koahub-skip koahub skip middleware koahub skip Conditionally skip a middleware when a condition is m ...

  8. iOS开发---集成百度地图完善版

    一.成为百度的开发者.创建应用 http://developer.baidu.com/map/index.php?title=首页 (鼠标移向 然后选择你的项目需要的功能 你可以在里面了解到你想要使用 ...

  9. 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见

    智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...

随机推荐

  1. 设计模式原则(1)--Single Responsibility Principle(SRP)--单一职责原则

    1.定义: 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责.  2.使用场景: 如果类A有两个职责:d1,d2.当职责d1需要修改时,可能会导致原本运行正常的职责d2功能产生问题. ...

  2. js-函数柯里化

    内容来自曾探,<JavaScript设计模式与开发实践>,P49 函数柯里化(function currying)又称部分求值.一个currying的函数首先会接受一些参数,接受了这些参数 ...

  3. 【读书笔记】iOS-网络-HTTP-URL百分号编码

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ty ...

  4. equals与hashcode区别

    哈希码:   hashCode的作用是用来获取哈希码,也可以称作散列码.实际返回值为一个int型数据.用于确定对象在哈希表中的位置. Object中有hashcode方法,也就意味着所有的类都有has ...

  5. 正则匹配身份证有bug你知道么?

    在开发中,我们需要验证用户的输入信息,多半采用正则验证,下面就是身份证证号的几种常用的正则表达式: var  reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x) ...

  6. C# dynamic类型报错:“object”不包含“xxx”的定义

    一.起因: 最近在做的一个项目,因为很多地方要用到同一套流程.为了后期维护,要求将共用流程进行抽离,创建为一个公用的类库.在抽离之前程序运行是没有问题的,然而在抽离之后就得到了如题错误: object ...

  7. SAP FI/CO 基本概念

    每一个SAP从业者都对这些概念不陌生,理解透了这些概念,对SAP的业务体系构架才能有明确地认识. 1.集团(client)的概念:是SAP中的最高等级:每一个集团建立主数据库. 2.公司(Compan ...

  8. Oracle EBS INV 创建物料搬运单头

    CREATE OR REPLACE PROCEDURE XX_CreateMoveOrderHeader AS -- Common Declarations l_api_version NUMBER ...

  9. [BZOJ 1568][JSOI2008]Blue Mary开公司

    [BZOJ 1568][JSOI2008]Blue Mary开公司 题意 \(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作: 给定 \(b\) 和 \(k\), 向 \(S\) 中 ...

  10. C++第六次作业

    前言 拿到作业的时候,整个人都不好了,虽然之前和同学说以后一起写游戏,画界面,然而现在的自己对界面的知识一窍不通,虽然同学分享了一些资料,但是通过这次作业,发现自己火候还是不够-- 问题描述及仓库地址 ...