【iOS开发】如何用 Swift 语言进行LBS应用的开发?

本文分为三部分,第一部分详解用Swift语言开发LBS应用,并给出完整的示例与源代码;第二部分介绍如何申请LBS密钥,第三部分是综合示例查看,扫描二维码即可查看示例demo。

第一部分 使用Swift语言开发LBS应用

1、下载iOS地图SDK的最新版本,地址:http://lbs.amap.com/api/ios-sdk/down/

2、申请LBS密钥(见第二部分)。

3、xCode新建工程

新建一个 Single View Application 工程。注意:Language 选择 Swift

4、工程配置

a.引入地图库&搜索库

左侧目录中选中工程名,在 TARGETS->Build Phases-> Link Binary With Libaries 中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择解压后的 MAMapKit.framework 文件添加到工程中。

搜索库的添加方法同上。

b.引入AMap.bundle资源文件

AMap.bundle资源文件中存储了定位、默认大头针标注视图等图片,可利用这些资源图片进行开发。

左侧目录中选中工程名,在右键菜单中选择Add Files to “工程名”…,从 MAMapKit.framework->Resources 文件夹中选择 AMap.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。

c.引入系统库

左侧目录中选中工程名,在TARGETS->Build Settings-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中查找并选择所需的库(见下表),单击“Add”按钮,将库文件添加到工程中。

说明:

备注中,2D表示使用2D栅格地图需要的系统文件,3D表示使用3D矢量地图需要的系统文件、Search表示使用搜索库需要的系统文件。

SystemConfiguration.framework、CoreTelephonySecurity.framework、Security.framework 是为了统计app信息使用。

d.Swift编译配置

首先:新建桥接头文件(放在工程路径下),这里命名为 AMapDemoSwift-Bridging-Header.h,在该头文件中import需要的库文件,代码如下:

#import <MAMapKit/MAMapKit.h>
#import <AMapSearchKit/AMapSearchAPI.h>

然后,左侧目录中选中工程名,在 TARGETS->Build Phases-> Swift Compiler - Code Generation -> Objective-C Briding Header 中输入桥接文件的路径

5、地图的显示

以3D矢量地图SDK为例,进行介绍。

在 ViewController.swift 中,继承 MAMapViewDelegate 协议,在 viewDidLoad 方法中配置用户Key,初始化 MAMapView 对象,并添加到 Subview中。代码如下:

let APIKey = "8a1383b14466a8dbf362f44357c496c0"

class ViewController: UIViewController , MAMapViewDelegate{

    var mapView:MAMapView?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // 配置用户Key
        MAMapServices.sharedServices().apiKey = APIKey

        // 初始化MAMapView
        initMapView()
    }

    func initMapView(){

        mapView = MAMapView(frame: self.view.bounds)

        mapView!.delegate = self

        self.view.addSubview(mapView!)
    }
}

运行程序,地图显示出来了,就是这样简单~

6、一个实用的例子

逆地理编码为例,写一个完整的示例。实现步骤如下:

(1) 初始化主搜索对象AMapSearchAPI,并继承搜索协议 AMapSearchDelegate 。

(2) 构造 Request 对象,配置搜索参数。

(3) 通过主搜索对象以 Request 对象为参数,发起搜索。

(4) 实现搜索协议中对应的回调函数,通过解析 Response 对象获取搜索结果。

通过定位获取当前位置的经纬度,在点击定位标注(小蓝点)时,进行逆地理编码,在弹出的气泡中显示定位点的地址。实现该场景有以下几个步骤:

1.开启定位,显示定位标注(小蓝点)。

2.在定位的回调函数中获取定位点的经纬度。

3.点击定位标注,执行逆地理编码查询。

4.在逆地理编码回调中设置定位标注的title和subtitle。

全部源代码:

import UIKit

let APIKey = "8a1383b14466a8dbf362f44357c496c0"

class ViewController: UIViewController ,MAMapViewDelegate, AMapSearchDelegate{

    var mapView:MAMapView?
    var search:AMapSearchAPI?
    var currentLocation:CLLocation?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        MAMapServices.sharedServices().apiKey = APIKey

        initMapView()

        initSearch()
    }

    func initMapView(){

        mapView = MAMapView(frame: self.view.bounds)

        mapView!.delegate = self

        self.view.addSubview(mapView!)

        let compassX = mapView?.compassOrigin.x

        let scaleX = mapView?.scaleOrigin.x

        //设置指南针和比例尺的位置
        mapView?.compassOrigin = CGPointMake(compassX!, 21)

        mapView?.scaleOrigin = CGPointMake(scaleX!, 21)

        // 开启定位
        mapView!.showsUserLocation = true

        // 设置跟随定位模式,将定位点设置成地图中心点
        mapView!.userTrackingMode = MAUserTrackingModeFollow

    }

    // 初始化 AMapSearchAPI
    func initSearch(){
        search = AMapSearchAPI(searchKey: APIKey, delegate: self);
    }

    // 逆地理编码
    func reverseGeocoding(){

        let coordinate = currentLocation?.coordinate

        // 构造 AMapReGeocodeSearchRequest 对象,配置查询参数(中心点坐标)
        let regeo: AMapReGeocodeSearchRequest = AMapReGeocodeSearchRequest()

        regeo.location = AMapGeoPoint.locationWithLatitude(CGFloat(coordinate!.latitude), longitude: CGFloat(coordinate!.longitude))

        println("regeo :\(regeo)")

        // 进行逆地理编码查询
        self.search!.AMapReGoecodeSearch(regeo)

    }

    // 定位回调
    func mapView(mapView: MAMapView!, didUpdateUserLocation userLocation: MAUserLocation!, updatingLocation: Bool) {
        if updatingLocation {
            currentLocation = userLocation.location
        }
    }

    // 点击Annoation回调
    func mapView(mapView: MAMapView!, didSelectAnnotationView view: MAAnnotationView!) {
        // 若点击的是定位标注,则执行逆地理编码
        if view.annotation.isKindOfClass(MAUserLocation){
            reverseGeocoding()
        }
    }

    // 逆地理编码回调
    func onReGeocodeSearchDone(request: AMapReGeocodeSearchRequest!, response: AMapReGeocodeSearchResponse!) {
        println("request :\(request)")
        println("response :\(response)")

        if (response.regeocode != nil) {

            var title = response.regeocode.addressComponent.city

            var length: Int{
                return countElements(title)
            }

            if (length == 0){
                title = response.regeocode.addressComponent.province
            }
            //给定位标注的title和subtitle赋值,在气泡中显示定位点的地址信息
            mapView?.userLocation.title = title
            mapView?.userLocation.subtitle = response.regeocode.formattedAddress
        }

    }
}

全部源码下载:https://github.com/hadesh/MyRoute

第二部分 如何申请LBS密钥

1、访问申请KEY地址:http://lbs.amap.com/console/key/

2、输入真实应用名称,选择iOS SDK平台服务。

3、获取Bundle Indentifier

获取方式一、代码获取

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

获取方式二、Xcode切换到General标签,查看Bundle Identifier

4、点击获取KEY按钮。

第三部分 查看示例

如遇任何LBS相关问题,可以发送邮件至[email protected],48小时内回复您。

时间: 2024-10-04 02:36:51

【iOS开发】如何用 Swift 语言进行LBS应用的开发?的相关文章

IOS学习之路——Swift语言(1)——基本类型、运算符与逻辑控制语句

一.变量 变量标识符必须以字符包括Unicode编码字符.美元字符$.下划线_开头,不能以数字开头,不能包含空格.更不能使用关键字命名. swift中变量的声明使用var关键字,常量的声明使用let关键字. 1 var name="Swift"; 2 var version=2.2; 3 let company:String="Apple"; 变量的声明: 1. 可以使用,逗号分割变量来同时声明多个变量 2. 可以使用:类型来同时指明多个变量的类型 在Mac中可以使

如何用 Swift 语言构建一个自定控件

(via:破船之家,原文:How To Make a Custom Control in Swift) 用户界面控件是所有应用程序重要的组成部分之一.它们以图形组件的方式呈现给用户,用户可以通过它们与应用程序进行交互.苹果提供了一套控件, 例如 UITextField,UIButton,UISwitch.通过工具箱中的这些已有控件,我们可以创建各式各样的用户界面. 然而,有时候你希望界面做得稍微的与众不同,那么此时苹果提供的这些控件就无法满足你的需求. 自定义控件,除了是自己构建二外,与苹果提供

IOS学习之路——Swift语言(2)——基本类型与函数

一.可选型 为什么会有可选型?当一个变量被希望表示为某一个指定的类型值,同时也被希望在某种情况下表示为空.那么就需要一个可选型.Optional 可选型的语法是在Swift的基本类型后面添加 ? 符号,如 Int? String?  可选型如果取值为空,那么表示为 nil 如果想定义一个可选型的变量,那么需要显示的声明为可选型.可选型变量打印时显示Optional 可选型变量需要进行解包(unwrap)才能与其他的变量进行运算. 解包: 1. 强制解包,使用 ! 关键字,强制解包是具有风险的,当

拼图游戏之 IOS 版(用swift语言开发的)

因为公司项目需要,最近在学习IOS开发,为了巩固我的学习,我想着能不能把以前用C# 开发的拼图游戏移植到 Iphone 上呢,然后我就开始了这一移植的历程,因为这是第二次做这个游戏了,所以想的也就比较深入,对以前的算法进行了优化,借助系统提供的API又节省了不少代码.个人感觉这个游戏还是挺成功的. 界面设计: 开始之后: 算法: 自定义一个控件,有两个属性 ImageTag 和ImageIndex,ImageTag用来存储控件的位置,ImageIndex 用来存储图片的序号,tag 的取值范围是

iOS推送小结--swift语言

APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. iPhone当然就是我们的iOS设备了,CllentApp就是我们的客户端程序 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把

XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言)

如何在XCODE中的Main.Storyboard内拉入控件并实现一个简单的效果呢?本人由于刚接触Swift语言不久,对于IDE的操作还是很生疏,不懂了就在网上参考了网上前辈们的文章.以下我将演示如何用Swift语言配合Main.Storyboard演示一个小例子,对于新建一个SingleView Application在这里就不多说了. 创建好的应用程序已经自动创建好了一个和Main.Storyboard连接好的ViewController. 接下来我们在Main.Storyboard中的Vi

怎么让一个项目里swift与OC可以兼容混合开发?

在苹果推出了swift语言之后,很多人担心OC很快会被取代,但是苹果方面表示2年内不会摒弃OC.但现在也快了啊.有的开发团队已经开始基于swift开发,但是有很多旧的框架还没来得及用swift写出来,并且某些swift的功能你还不会写,想用OC写.因此在swift开发的程序中时不时会用到OC的类,怎么让两门语言在一个程序里无缝衔接? 其实很方便 如果你不是在董铂然博客园看到本文请 点击查看原文 如图这是一个新建的swift项目,里面直接拖入了一个SVProgressHUD框架 因为swift语言

使用swift语言进行IOS应用开发

在Swift中能够直接使用Objective-C语言提供的api (包括系统框架与自己的定制代码),也能够在Objective-C中使用Swift提供的类和api ,还能够在一个工程中同时混合使用Swift 和Objective-C两种语言,两种语言之间能够互通和互用. 任意Objective-C的框架或C库(包括所有的Objective-C系统框架,例如Foundation.UIKit.SpriteKit以及系统提供的公共c库)作为模块被直接导入Swift 供Swift语言使用. 例如为了使用

【iOS开发每日小笔记(六)】Swift语言学习的入门随想

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论