TomTom Maps的SDK:可识别位置的iOS应用

位置感知应用程序推动了全球许多最受欢迎的数十亿美元独角兽初创公司的参与。 尽管Google Maps最近将其Maps API的费率提高了14倍(请参阅https://nordicapis.com/5-powerful-alternatives-to-google-maps-api/),但仍有许多不同的Maps SDK可供选择例如OpenLayers,MapBox,HERE,Mapfit或TomTom。 在这里,您将了解如何使用TomTom的iOS SDK构建可识别位置的iOS应用程序的基础知识!

尽管TomTom的地图API提供了平铺地图,矢量地图,标记,位置搜索,交通密度,路线查找,但在本博客中,您将专注于一个功能,可用于构建简单的位置感知iOS应用程序:TomTom的地图和搜索模块。

完成后,您的iOS应用程序将在屏幕上显示TomTom的地图软件,为每个关键字搜索启用注释,并提供用于切换如何显示GPS坐标或城市名称的按钮。

初始设置

API密钥

转到TomTom的开发人员门户https://www.tomtommaps.com。 创建一个帐户。 导航到仪表板。 创建一个应用程序。 选择“在线地图”下的所有选项。 创建应用程序后,单击应用程序。 提取您的API密钥!

创建单视图应用程序

打开Xcode。 创建一个单视图应用程序。 调用“ LocationAwareApp”。 记住项目保存的目录。 打开`Info.plist`文件。 在“键”列下,添加“ OnlineMap.Key”。 添加您的API密钥!

可可豆

导航到保存项目的目录。 如果您已经安装了CocoaPods,则运行`pod init`。 打开`Podfile`。 添加以下内容:

use_frameworks!

platform :ios, '10.0'

 目标“地图”多普达“ TomTomOnlineSDKMaps” 
pod'TomTomOnlineSDKSearch'结束

将这些行保存到“ Podfile”后,运行“ pod install”并观看TomTom的Maps软件安装到您刚创建的单一视图应用程序中!

集成SDK

下一步是集成SDK! 您将对应用程序进行编程,以显示TomTom的地图!

进口货

导航到名为“ ViewController.swift”的文件。 添加以下内容:

import TomTomOnlineSDKMaps

import TomTomOnlineSDKSearch

TomTom( 以下称 TT)通过“ TTMapView”显示地图。 通过以下方式为mapView设置弱变量出口:

@IBOutlet weak var mapView: TTMapView!

viewDidLoad()您可以通过以下方式对mapView进行编程:

self.mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

self.mapView.setTilesType(.vector)

最后但并非最不重要的是“ Main.storyboard”。 在“ Main.storyboard”中,您需要将“ MapView”的实例拖放到视图控制器场景的周边。 控制从IBOutlet的MapView拖动到MapView实例,并将其设置为连接。 如果一切顺利,那么您应该能够在iOS设备上显示TomTom的地图!

添加搜索栏

哇! 您正在运行地图。 您现在要添加搜索栏! 要添加搜索栏,需要两个步骤。 第一步是苹果自己的协议,第二步是TT。

苹果的协议

要添加搜索栏,使视图控制器符合UISearchBarDelegate,以便它可以处理UISearchBar对象的接口,并且委托至少需要对输入的内容执行实际搜索。

UISearchBar对象为条形图上的搜索字段提供了用户界面,但是轻按按钮时,由应用程序负责执行操作。 当在文本字段中输入文本时,代表至少需要执行实际搜索。

@IBOutlet weak var searchBar: UISearchBar!

Main.storyboard添加一个UISearchBar实例,将其正确放置在布局中,并创建一个与之前创建的弱变量插座searchBar的连接。 将searchBar的委托设置为视图控制器。

最后但并非最不重要的searchBar()是,通过以下方式实现和编程文本的searchBar()函数:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

search.cancel()

守卫让文本= searchBar.text,
text.isEmpty == false else {返回mapView.annotationManager.removeAllAnnotations()}

让查询= TTSearchQueryBuilder.create(withTerm:文本).build()
search.search(with:查询)
}

TT的协议

满足苹果的要求,使视图控制器符合TT自己的搜索委托TTSearchDelegate,并作为同一视图控制器类的一部分,创建TTSearch()的实例并清空初始化数组类型TTSearchResult以下列方式:

let search = TTSearch()

var searchResults:[TTSearchResult] = []

编写功能。

func search(_ search: TTSearch, completedWith response: TTSearchResponse) {
self.searchResults = response.results
mapView.annotationManager.removeAllAnnotations()

打印(“结果计数:”,searchResults.count)

searchResults.forEach({
让注释= TTAnnotation(坐标:$ 0.position)
comment.canShowCallout = true
mapView.annotationManager.add(annotation)
})
}

func search(_ search:TTSearch,failedWithError错误:TTResponseError){
打印(错误)
}

瞧! 您现在有搜索。 继续搜索。

添加注释

要添加注释,请使视图控制器符合“ TTAnnotationDelegate”。

通讯协定

为了搜索TT的地图,您的视图控制器必须符合TT的搜索协议。 为了遵守协议,您将`mapView`设置为管理员。

在`viewDidLoad()`中添加以下代码行:

self.mapView.annotationManager.delegate = self

下一步是对管理器进行编程,以为您处理注释。

func annotationManager(_ manager: TTAnnotationManager, viewForSelectedAnnotation selectedAnnotation: TTAnnotation) -> UIView & TTCalloutView {

返回TTCalloutViewSimple(annotation:selectedAnnotation)
}

要走的路。 您添加了注释。

切换GPS或名称

假设您要显示的不仅是注释的经度和纬度,还要显示名称(如果是城市)。 使用TT的地图,您可以轻松做到。

通过以下方式创建一个名为`segmentControl`的弱变量轮廓:

@IBOutlet weak var segmentControl: UISegmentedControl!

导航到“ Main.storyboard”。 将“ UISegmentedControl”的实例拖放到“ mapView”上。 将“ segmentedControl”从情节提要板连接到控制器。

最后,导航至用于注释管理的功能。 将以下代码添加到您的函数中:

if segmentControl.selectedSegmentIndex == 1 { //ie Address
let result = searchResults.first(where: {
$0.position.latitude == selectedAnnotation.coordinate.latitude &&
$0.position.longitude == selectedAnnotation.coordinate.longitude
})

让文本=结果?.address.freeformAddress? “地址不可用”
返回TTCalloutViewSimple(text:text)
}

在这里,您只是在利用Swift的一种语言功能(即,如果允许)与TT maps SDK中免费提供的用于显示地址的内容进行交互。 通过将地址结果传递给freeformAddress,SDK本身就解决了解析问题,而无需付出任何额外的努力。

如果一切顺利,您的位置感知iOS应用程序将显示TT的地图,搜索,显示搜索注释,并且如果注释是城市,则可让您在GPS坐标和名称之间切换!