孙叫兽带你了解腾讯位置服务的认证与接入,多种行业方案参考!

前言:腾讯位置服务为各类应用厂商和开发者提供领先的LBS服务和解决方案;有针对Web应用的JavaScript API, 适合手机端Native APP的各种SDK, WebService接口,适合小程序的插件和各类地图API等。

目录

接入指南 

地图组件(H5)

地图javaScript API

定位SDK  (Android定位 SDK |    IOS定位 SDK)

地图SDK(Android地图SDK |  IOS地图SDK)

WebService API:参考文档

地主认证通道:

常见问题

腾讯位置服务控制台

行业解决方案

腾讯位置服务技术教程

腾讯位置特色产品实例


 

接入指南 

接入步骤:(快速通道:腾讯位置官网

作为开发者应该如何选择对应的API?

地图组件(H5)

手机组件H5,完整应用,不需要开发者进行开发,——》参考文档

位置展示组件,可以在地图上展示一个或多个位置点。数据来源支持三种方式:通过URL传递数据、地图检索数据和自有定制数据。 可以展示每个位置点的名称、地址等详细信息,也可查看该位置点的街景信息或发起到该位置的路线规划。

例如:

调用地址:

https://apis.map.qq.com/tools/poimarker?type=0&marker=coord:39.96554,116.26719;title:成都;addr:北京市海淀区复兴路32号院|coord:39.87803,116.19025;title:成都园;addr:北京市丰台区射击场路15号北京园博园|coord:39.88129,116.27062;title:老成都;addr:北京市丰台区岳各庄梅市口路西府景园六号楼底商|coord:39.9982,116.19015;title:北京园博园成都园;addr:北京市丰台区园博园内&key=yourkey&referer=myapp

地图javaScript API

用于浏览器端地图显示与应用,兼容手机端及PC端——》参考文档

JavaScript API V2可用于在网站中加入交互性强的街景、地图,能很好地支持PC及手机设备,身材小巧,动画效果顺滑流畅,动感十足,提供地图操作、标注、地点搜索、出行规划、地址解析、街景等接口,功能丰富,并免费开放各种附加工具库。JavaScript API V2是免费服务,任何提供免费访问的网站都可以调用。

可视化组件是JSAPI的附加库,在加载JavaScript API服务请求中通过libraries参数指明引入

<script charset=“utf-8” src=“https://map.qq.com/api/js?v=2.exp&key=YOUR_KEY&libraries=visualization”>

接口均定义在qq.maps.visualization全局变量中,需在地图初始化完成之后使用

var map = new qq.maps.Map(container, mapOpts);
var dots = new qq.maps.visualization.Dots({
    map: map
});
dots.setData(data);

例如:我们要显示以北京的天安门为中心的 603x300 地图:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>孙叫兽测试天安门地图</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<style type="text/css">
html,body{
    width:100%;
    height:100%;
}
*{
    margin:0px;
    padding:0px;
}
body, button, input, select, textarea {
    font: 12px/16px Verdana, Helvetica, Arial, sans-serif;
}
p{
    width:603px;
    padding-top:3px;
    overflow:hidden;
}
.btn{
    width:142px;
}
#container{
    width:100%;
    height:100%;
}
</style>
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"></script>
<script>

window.onload = function(){

//直接加载地图


    //初始化地图函数  自定义函数名init
    function init() {
        //定义map变量 调用 qq.maps.Map() 构造函数   获取地图显示容器
         var map = new qq.maps.Map(document.getElementById("container"), {
            center: new qq.maps.LatLng(39.916527,116.397128),      // 地图的中心地理座标。
            zoom:8                                                 // 地图的中心地理座标。
        });
    }

    //调用初始化函数地图
    init();


}
</script>
</head>
<body>
<!--   定义地图显示容器   -->
<div id="container"></div>
</body>
</html>

效果:

加载地图API:

方式一:页面直接引入。

<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"></script>

方式二:异步加载 JavaScript API

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>异步加载地图</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<style type="text/css">
html,body{
    width:100%;
    height:100%;
}
*{
    margin:0px;
    padding:0px;
}
body, button, input, select, textarea {
    font: 12px/16px Verdana, Helvetica, Arial, sans-serif;
}
p{
    width:603px;
    padding-top:3px;
    overflow:hidden;
}
#container{
    width:100%;
    height:100%;
}
.btn{
    width:142px;
}
</style>
<script>


function init() {
  //设置地图中心点
  var myLatlng = new qq.maps.LatLng(39.916527,116.397128);
  //定义工厂模式函数
  var myOptions = {
    zoom: 8,               //设置地图缩放级别
    center: myLatlng,      //设置中心点样式
    mapTypeId: qq.maps.MapTypeId.ROADMAP  //设置地图样式详情参见MapType
  }
  //获取dom元素添加地图信息
  var map = new qq.maps.Map(document.getElementById("container"), myOptions);
}
  //异步加载地图库函数文件
function loadScript() {
  //创建script标签
  var script = document.createElement("script");
  //设置标签的type属性
  script.type = "text/javascript";
  //设置标签的链接地址
  script.src = "https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&callback=init";
  //添加标签到dom
  document.body.appendChild(script);
}
  
window.onload = loadScript;    // dom文档加载结束开始加载 此段代码
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>

效果:

有如下功能:

叠加覆盖物 强大的附加库 定义自己的地图
提供点标注、折线、圆、多边形、信息窗
口等覆盖物,用户可以定义个性化地图。
提供了鼠标绘制工具箱、几何运算、座标
转换、文本输入提示等附加库。
支持用户可以自定义地图类型,使用自己
的数据或图片,自定义切图、取图规则。

 

定位SDK  (Android定位 SDK |    IOS定位 SDK)

腾讯地图定位SDK是一套基于Android 4.1及以上版本设备的应用程序接口。通过该接口,您可以轻松使用腾讯地图定位服务,构建LBS应用程序。

定位SDK包括GPS定位与网络定位,实现了经纬度座标偏转与当前位置的POI名称、地址或者行政区划的查询。采用了移动缓存策略,节省流量与电量。

定位SDK是提供给具有一定Android编程经验和了解面向对象概念的开发者使用。

本android示例采用后台定位方式:

当用户进程出于后台时,有时也会有需求使用定位服务,但应用处于后台时Android系统会对定位做诸多限制。因此我们通过设置前台Service的方式来提高进程级别,使定位服务由后台转向前台。

 1.manifest增加Service声明

<service android:name="com.tencent.map.geolocation.s" />

 

2.在启动定位之前,调用enableForegroundLocation

mLocationManager.enableForegroundLocation(LOC_NOTIFICATIONID, buildNotification());
mLocationManager.requestLocationUpdates(request, this, getMainLooper());

构建Notification(其中enableForegroundLocation的参数分别是一个整形的NotificationID,一个是Notification的实例。)

private Notification buildNotification() {
    Notification.Builder builder = null;
    Notification notification = null;
    if (android.os.Build.VERSION.SDK_INT >= 26) {
        //Android O上对Notification进行了修改,如果设置的targetSDKVersion>=26建议使用此种方式创建通知栏
        if (notificationManager == null) {
            notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        }
        String channelId = getPackageName();
        if (!isCreateChannel) {NotificationChannel notificationChannel = new NotificationChannel(channelId,
                    NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
            notificationChannel.enableLights(true);//是否在桌面icon右上角展示小圆点
            notificationChannel.setLightColor(Color.BLUE); //小圆点颜色
            notificationChannel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
            notificationManager.createNotificationChannel(notificationChannel);
            isCreateChannel = true;
        }
        builder = new Notification.Builder(getApplicationContext(), channelId);
    } else {
        builder = new Notification.Builder(getApplicationContext());
    }
    builder.setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("LocationDemo")
            .setContentText("正在后台运行")
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
            .setWhen(System.currentTimeMillis());

    if (android.os.Build.VERSION.SDK_INT >= 16) {
        notification = builder.build();
    } else {
        notification = builder.getNotification();
    }
    return notification;
}

3.在停止定位之后,调用disableForegroundLocation停止前台服务

LocationManager.removeUpdates(this);
mLocationManager.disableForegroundLocation(true);

权限配置(请在manifest文件下配置如下权限:)

<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 访问网络. 某些位置信息需要从网络服务器获取 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问WiFi状态. 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 修改WiFi状态. 发起WiFi扫描, 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 访问网络状态, 检测网络的可用性. 需要网络运营商相关信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 访问手机当前状态, 需要device id用于网络定位 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 支持A-GPS辅助定位 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于 log 日志 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

说明随着Android版本的升级,权限使用方面也有变动,具体可参考实用文档中针对Android各个版本的适配文档。

定位服务是一个重度依赖用户授权的功能,因此在App设计时必须充分考虑获取用户权限的方式,合理引导用户授予权限。

 

腾讯 iOS 定位 SDK 提供了不依赖于地图定位的定位功能,开发者可以无地图显示的场景中便捷地为应用程序添加定位功能。 iOS定位SDK提供了单次定位、连续定位、逆地理信息等功能。兼容iOS7.0 及以上版本。

定位权限申请

(1) 需要在https://lbs.qq.com/dev/console/key/add上面申请一个apiKey,对应在TencentLBSLocationManager的apiKey属性上设置才可以使用。

(2) 需要在info.plist中追加 NSLocationWhenInUseUsageDescription 或NSLocationAlwaysUsageDescription 字段,以申请定位权限。

  (3) allowsBackgroundLocationUpdates表示是否允许后台定位。默认为 NO。只在iOS 9.0 及以后起作用。设置为 YES 的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。注意,如果不设置为YES,不需要申请该权限,否则会审核不通过!

引入定位包: 将库文件 TencentLBS.framework 拷贝到您的APP的工程目录下,在Xcode的Target中选择 “Build Phases”->“Link Binary With Libraries”->“Add”->“Add Other…”-> 选择 TencentLBS.framework 目录并添加。

引入系统库文件:仿照上面的操作 ("Add"的时候直接在列表中查找选择 )添加系统库libz.1.2.5.tbd 在 Build Setting - Linking - Other Linker Flags 里 添加 -lstdc++.6.0.9, -lsqlite3(注意:在 Xcode9 以上,不再需要这两个库) 。

- (void)configLocationManager
{
    self.locationManager = [[TencentLBSLocationManager alloc] init];
 
    [self.locationManager setDelegate:self];
 
    [self.locationManager setApiKey:@"对应于申请的apiKey "];
 
    [self.locationManager setPausesLocationUpdatesAutomatically:NO];
 
    // 需要后台定位的话,可以设置此属性为YES。
    [self.locationManager setAllowsBackgroundLocationUpdates:YES];
 
    // 如果需要POI信息的话,根据所需要的级别来设定,定位结果将会根据设定的POI级别来返回,如:
    [self.locationManager setRequestLevel:TencentLBSRequestLevelName];
 
    // 申请的定位权限,得和在info.list申请的权限对应才有效
    CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
    if (authorizationStatus == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestWhenInUseAuthorization];
    }
}
 
// 单次定位
- (void)startSingleLocation {
    [self.locationManager requestLocationWithCompletionBlock:
        ^(TencentLBSLocation *location, NSError *error) {
            NSLog(@"%@, %@, %@", location.location, location.name, location.address);
        }];
}
 
// 连续定位
- (void)startSerialLocation {
    //开始定位
    [self.locationManager startUpdatingLocation];
}
 
- (void)stopSerialLocation {
    //停止定位
    [self.locationManager stopUpdatingLocation];
}
 
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
                 didFailWithError:(NSError *)error {
    CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
    if (authorizationStatus == kCLAuthorizationStatusDenied ||
        authorizationStatus == kCLAuthorizationStatusRestricted) {
        [self.displayLabel setText:@"定位权限没开启!"];
 
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                       message:@"定位权限未开启,是否开启?"
                                                                preferredStyle:UIAlertControllerStyleAlert];
        [alert addAction:[UIAlertAction actionWithTitle:@"是"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction * _Nonnull action) {
            if( [[UIApplication sharedApplication]canOpenURL:
                [NSURL URLWithString:UIApplicationOpenSettingsURLString]] ) {
                [[UIApplication sharedApplication] openURL:
                    [NSURL URLWithString:UIApplicationOpenSettingsURLString]];
            }
        }]];
 
        [alert addAction:[UIAlertAction actionWithTitle:@"否"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction * _Nonnull action) {
        }]];
 
        [self presentViewController:alert animated:true completion:nil];
 
    } else {
        [self.displayLabel setText:[NSString stringWithFormat:@"%@", error]];
    }
}
 
 
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
                didUpdateLocation:(TencentLBSLocation *)location {
    //定位结果
    NSLog(@"location:%@", location.location);
}

报错状态提示:

typedef NS_ENUM(NSUInteger, TencentLBSLocationError) {
    TencentLBSLocationErrorUnknown = 0,                 //!< 错误码,表示目前位置未知,但是会一直尝试获取
    TencentLBSLocationErrorDenied = 1,                  //!< 错误码,表示定位权限被禁止
    TencentLBSLocationErrorNetwork = 2,                 //!< 错误码,表示网络错误
    TencentLBSLocationErrorHeadingFailure = 3,          //!< 错误码,表示朝向无法确认
    TencentLBSLocationErrorOther = 4,                   //!< 错误码,未知错误
};

地图SDKAndroid地图SDKIOS地图SDK

用于手机端APP嵌入地图与应用。

安卓3D适用于对地图强依赖场景,如导航、打车、代驾等。也可用于可穿戴设备。2D适用于辅助位置展示场景,如选择发送位置、地址展示、轨迹展示等,建议对包大小敏感的开发者选择用。

AndroidStudio配置

第1步: 获取Key
[点我获取Key>>](/mobile/androidMapSDK/developerGuide/getKey)

第2步:创建AndroidStudio项目
在AndroidStudio中创建一个空的Android项目。

第3步:在项目中集成SDK
在 AndroidStudio 项目中集成腾讯地图 SDK 主要有两种方式: 
1. 手动将腾讯地图 sdk 的 jar 包和 so 库导入到工程 
2. 通过 Gradle 配置 maven 或 jcenter 仓库集成 SDK 


我们更推荐用户使用第二种方式,即,通过 maven 导入腾讯地图 SDK,下面我们详细介绍下两种方式。 

通过拷贝 jar 包、so 库添加 SDK

  1. 首先,请您在这里获取腾讯地图 SDK for Andorid 及其 demo。

  2. 解压下载的压缩包并拷贝文件 
    以4.3.4版本的地图功能为例,解压后,得到一个 libs文件夹,该文件夹中包含tencent-mapsdk-release-4.3.4.b8edc92f.jar文件和一个jniLibs文件夹(文件中包含所有的so库文件) 

  3. 将 libs 目录下的"*.jar"文件拷贝到 AndroidStudio 项目对应的 app/libs/ 文件夹下。 


右键该jar包,选择add as library,弹出如下窗口: 
 

点击OK即可,变成下图所示就是导入成功: 

 

  1. 将 jniLibs 目录下的所有文件按照原目录格式,拷贝到AndroidStudio项目对应的 app/src/main/jniLibs/ 目录下。




腾讯地图Android SDK还提供了地图组件库TencentMapUtils,目前地图组件包含了点聚合组件、小车平滑移动组件。 组件

IOS自动部署如下:

用户使用腾讯地图 iOS SDK 支持项目开发时,可以通过 Cocoapods 自动部署将 SDK 添加到工程当中。自动部署目前仅支持 腾讯地图 iOS SDK 4.2.6.2 及以上版本

获取CocoaPods

CocoaPods 是一种支持 Swift 和 Objective-C 项目的第三方库资源管理器,用户可通过 Cocoapods 获取腾讯地图 iOS SDK。

如果您已安装了CocoaPods,请直接跳到第二步:通过CocoaPods安装SDK。

1. 配置 ruby 的软件源

建议通过ruby安装CocoaPods。由于默认的 ruby 的软件源 “http://mirrors.tencent.com/rubygems/” 被墙阻拦导致 CocoaPods 安装失败,因此需要更新一下 ruby 的源。依次执行如下命令:

# 添加 TUNA 源并移除默认源
gem sources --add http://mirrors.tencent.com/rubygems/ --remove https://rubygems.org/
   
#(查看当前ruby的源是否成功更换)
gem sources -l 

完成上述命令后,显示如下文字则表示更新成功

*** CURRENT SOURCES *** 
http://mirrors.tencent.com/rubygems/

 

2. 升级 gem

将 gem 的版本更新到最新确保 Cocoapods 安装成功

sudo gem update --system

 

3. 安装 Cocoapods

请使用以下命令安装 Cocoapods:

sudo gem install -n /usr/local/bin cocoapods pod setup

注:Cocoapods 安装过程可能会耗时较长,也有可能受网络的状况导致失败,如果安装失败请再次尝试

通过 CocoaPods 安装 SDK

1. 创建 Podfile

在当前 工程文件 (.xcodeproj) 所在文件夹下创建一个名为 Podfile 的文件。Podfile 内容如下:

platform :ios, "8.0" 		# 手机系统版本
target "QMapKitDemo" do	        # 工程的名字
pod 'Tencent-MapSDK'		# 地图SDK
end
   
#当有多个target时,不同的target也需要各自设置
#target "QMapKitDemo1" do		# 工程的名字
#	pod 'Tencent-MapSDK'		# 地图SDK
#end
   
#target "QMapKitDemo2" do		# 工程的名字
#	pod 'Tencent-MapSDK'		# 地图SDK
#end

 

2. 安装SDK

#用于保证本地地图相关 SDK 为最新版 
pod repo update 
   
#安装 SDK
pod install

命令执行成功后,会生成 .xcworkspace 文件,打开.xcworkspace 文件以启动工程(注意:此时不能同时开启.xcodeproj文件,示例:

 
 

3. 升级 SDK

若已通过自动部署安装了腾讯地图 iOS SDK,想要更新到最新版本,可在 Podfile 文件所在目录下执行以下指令:

pod repo update # 用于保证本地地图相关SDK为最新版 
pod update

 

4. 安装指定版本 SDK

自动部署目前仅支持地图 iOS SDK 4.2.6.2及以上版本,使用指定版本 SDK,需修改 Podfile 文件,示例:

platform :ios, "8.0" 				# 手机系统版本
target "QMapKitDemo" do			        # 工程的名字
pod 'Tencent-MapSDK', '~> 4.2.6.2'  	        # 在此修改或添加 3D SDK 版本号
end

然后执行命令:

#用于保证本地地图相关 SDK 为最新版 
pod repo update 

# 安装 SDK
pod install

WebService API:参考文档

 腾讯地图WebService API 是基于HTTPS/HTTP协议的数据接口,开发者可以使用任何客户端、服务器和开发语言,按照腾讯地图WebService API规范,按需构建HTTPS请求,并获取结果数据(目前支持JSON/JSONP方式返回)。

注意:这个有调用 配额限制说明(其他产品均无调用限制):https://lbs.qq.com/service/webService/webServiceGuide/webServiceQuota

腾讯位置服务API Key,在调用时用于唯一标识开发者身份,API KEY是各产品通用的,也就是说同一个Key可以用在地图SDK,也可以用在JavascriptAPI,也可以用在WebServiceAPI以及其它各产品中,可针对不同产品可独立启用(开关)。
假设您的某个Key只会调用地图SDK,可在Key配置界面,将其它产品关闭,以降低安全风险。

 

在Key设置中,勾中WebService复选框,即为启用产品,该Key才可调用WebServiceAPI服务 未启用时请求服务,会返回:

{ "status": 199, "message": "此key未开启webservice功能" }

申请密钥

示例:

https://apis.map.qq.com/ws/place/v1/search?keyword=酒店&boundary=nearby(39.908491,116.374328,1000)&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77

多种安全策略配置请参考:安全策略说明

地主认证通道:

如果你是某个地点的经营者,所有者等,可以自行申请认证,审核通过即可在地图上展示申请地点,入口

各类企事业单位、个体工商户,对自己的经营场所、实体店铺希望腾讯地图进行收录的,均可申请商户标注。提交商户标注后,您所填写的信息会被所有用户看到,因此请确认您提交的位置信息符合国家相关法律(例如军事设施,保密地点等信息根据国家相关法律不能提交)。已有商户标注存在有误的,可以提交地点纠错修改。

常见问题

地主认证常见问题

接入认证常见问题

腾讯位置服务控制台

一文带你了解腾讯位置服务的开发与接入

行业解决方案

参考文档

腾讯位置服务技术教程

参考文档

腾讯位置特色产品实例

参考文档

 

好啦,本期腾讯位置服务内容就分享到这里,我们下期见!

需要腾讯位置服务可以从下方通道快速进入,填写邀请码获得更多技术支持!

腾讯位置服务注册地址:https://lbs.qq.com?lbs_invite=3Z2RFL3                    

邀请码:3Z2RFL3  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章