├── note.md
├── ios
├── Frameworks
│ ├── AMapLocationKit.framework
│ │ ├── 2.2.0.3c0ed2d
│ │ ├── AMapLocationKit
│ │ └── Headers
│ │ │ ├── AMapLocationKit.h
│ │ │ ├── AMapLocationVersion.h
│ │ │ ├── AMapLocationRegionObj.h
│ │ │ ├── AMapLocationCommonObj.h
│ │ │ └── AMapLocationManager.h
│ └── AMapFoundationKit.framework
│ │ ├── 1.3.2.d4e0936
│ │ ├── AMapFoundationKit
│ │ └── Headers
│ │ ├── AMapFoundationKit.h
│ │ ├── AMapFoundationVersion.h
│ │ ├── AMapServices.h
│ │ ├── AMapURLSearch.h
│ │ ├── AMapUtility.h
│ │ ├── AMapURLSearchType.h
│ │ └── AMapURLSearchConfig.h
└── RCTAMapLocation
│ ├── RCTAMapLocation
│ ├── RCTAMapLocation.h
│ └── RCTAMapLocation.m
│ └── RCTAMapLocation.xcodeproj
│ ├── project.xcworkspace
│ └── contents.xcworkspacedata
│ └── project.pbxproj
├── android
├── src
│ └── main
│ │ ├── res
│ │ └── values
│ │ │ └── strings.xml
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── reactnativecomponent
│ │ └── amaplocation
│ │ ├── RCTAMapLocationPackage.java
│ │ └── RCTAMapLocationModule.java
├── proguard-rules.pro
└── build.gradle
├── .gitignore
├── .npmignore
├── AMapLocation.js
├── package.json
├── LICENSE
└── README.md
/note.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/2.2.0.3c0ed2d:
--------------------------------------------------------------------------------
1 | 2.2.0.3c0ed2d
2 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/1.3.2.d4e0936:
--------------------------------------------------------------------------------
1 | 1.3.2.d4e0936
2 |
--------------------------------------------------------------------------------
/android/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | AMapLocation
3 |
4 |
--------------------------------------------------------------------------------
/ios/RCTAMapLocation/RCTAMapLocation/RCTAMapLocation.h:
--------------------------------------------------------------------------------
1 | #import
2 |
3 | @interface RCTAMapLocation : NSObject
4 |
5 | @end
6 |
--------------------------------------------------------------------------------
/android/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/AMapLocationKit:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/react-native-component/react-native-smart-amap-location/HEAD/ios/Frameworks/AMapLocationKit.framework/AMapLocationKit
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.[aod]
2 | *.DS_Store
3 | .DS_Store
4 | *Thumbs.db
5 | *.iml
6 | .gradle
7 | .idea
8 | node_modules
9 | npm-debug.log
10 | /android/build
11 | /ios/**/*xcuserdata*
12 | /ios/**/*xcshareddata*
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | *.[aod]
2 | *.DS_Store
3 | .DS_Store
4 | *Thumbs.db
5 | *.iml
6 | .gradle
7 | .idea
8 | node_modules
9 | npm-debug.log
10 | /android/build
11 | /ios/**/*xcuserdata*
12 | /ios/**/*xcshareddata*
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/AMapFoundationKit:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/react-native-component/react-native-smart-amap-location/HEAD/ios/Frameworks/AMapFoundationKit.framework/AMapFoundationKit
--------------------------------------------------------------------------------
/ios/RCTAMapLocation/RCTAMapLocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AMapLocation.js:
--------------------------------------------------------------------------------
1 | /*
2 | * A smart AMap location Library for react-native apps
3 | * https://github.com/react-native-component/react-native-smart-amap-location/
4 | * Released under the MIT license
5 | * Copyright (c) 2016 react-native-component
6 | */
7 |
8 | import {
9 | NativeModules
10 | } from 'react-native'
11 |
12 | export default NativeModules.AMapLocation
13 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/Headers/AMapLocationKit.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapLocationKit.h
3 | // AMapLocationKit
4 | //
5 | // Created by AutoNavi on 15/10/22.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #import
12 | #import
13 | #import
14 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapFoundationKit.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapFoundationKit.h
3 | // AMapFoundationKit
4 | //
5 | // Created by xiaoming han on 15/10/28.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 | #import
12 | #import
13 | #import
14 |
15 | #import
16 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapFoundationVersion.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapFoundationVersion.h
3 | // AMapFoundation
4 | //
5 | // Created by xiaoming han on 15/10/26.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #ifndef AMapFoundationVersion_h
12 | #define AMapFoundationVersion_h
13 |
14 | #define AMapFoundationVersionNumber 10302
15 |
16 | FOUNDATION_EXTERN NSString * const AMapFoundationVersion;
17 | FOUNDATION_EXTERN NSString * const AMapFoundationName;
18 |
19 | #endif /* AMapFoundationVersion_h */
20 |
--------------------------------------------------------------------------------
/android/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/cyqresig/Library/Android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.3"
6 |
7 | defaultConfig {
8 | minSdkVersion 16
9 | targetSdkVersion 23
10 | versionCode 1
11 | versionName "1.0"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | compile fileTree(dir: 'libs', include: ['*.jar'])
23 | compile 'com.android.support:appcompat-v7:23.4.0'
24 | compile "com.facebook.react:react-native:+" // From node_modules
25 | compile 'com.amap.api:location:3.1.0'
26 | }
27 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-native-smart-amap-location",
3 | "version": "1.1.3",
4 | "description": "A AMap location Library for React Native apps.",
5 | "main": "AMapLocation.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/react-native-component/react-native-smart-amap-location.git"
12 | },
13 | "keywords": [
14 | "react-native",
15 | "smart",
16 | "location",
17 | "amap",
18 | "component"
19 | ],
20 | "author": "HISAME SHIZUMARU",
21 | "license": "MIT",
22 | "bugs": {
23 | "url": "https://github.com/react-native-component/react-native-smart-amap-location/issues"
24 | },
25 | "homepage": "https://github.com/react-native-component/react-native-smart-amap-location#readme"
26 | }
27 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/Headers/AMapLocationVersion.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapLoctionVersion.h
3 | // AMapLocationKit
4 | //
5 | // Created by AutoNavi on 16/1/22.
6 | // Copyright © 2016年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | #ifndef AMapLoctionVersion_h
13 | #define AMapLoctionVersion_h
14 |
15 | #define AMapLocationVersionNumber 20200
16 | #define AMapLocationFoundationVersionMinRequired 10300
17 |
18 | // 依赖库版本检测
19 | #if AMapFoundationVersionNumber < AMapLocationFoundationVersionMinRequired
20 | #error "The AMapFoundationKit version is less than minimum required, please update! Any questions please to visit http://lbs.amap.com"
21 | #endif
22 |
23 | FOUNDATION_EXTERN NSString * const AMapLocationVersion;
24 | FOUNDATION_EXTERN NSString * const AMapLocationName;
25 |
26 | #endif /* AMapLoctionVersion_h */
27 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapServices.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapSearchServices.h
3 | // AMapSearchKit
4 | //
5 | // Created by xiaoming han on 15/6/18.
6 | // Copyright (c) 2015年 xiaoming han. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AMapServices : NSObject
12 |
13 | + (AMapServices *)sharedServices;
14 |
15 | /**
16 | * APIkey。设置key,需要绑定对应的bundle id。
17 | */
18 | @property (nonatomic, copy) NSString *apiKey;
19 |
20 | /**
21 | * 是否开启HTTPS,默认为NO。
22 | * 目前已支持服务:key鉴权、云图、搜索。
23 | */
24 | @property (nonatomic, assign) BOOL enableHTTPS;
25 |
26 | /**
27 | * 是否启用崩溃日志上传。默认为YES, 只有在真机上设置有效。
28 | * 开启崩溃日志上传有助于我们更好的了解SDK的状况,可以帮助我们持续优化和改进SDK。
29 | * 需要注意的是,我是通过设置NSUncaughtExceptionHandler来捕获异常的,如果您的APP中使用了其他收集崩溃日志的SDK,或者自己有设置NSUncaughtExceptionHandler的话,请保证 AMapServices 的初始化是在其他设置NSUncaughtExceptionHandler操作之后进行的,我们的handler会再处理完异常后调用前一次设置的handler,保证之前设置的handler会被执行。
30 | */
31 | @property (nonatomic, assign) BOOL crashReportEnabled;
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapURLSearch.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapURLSearch.h
3 | // AMapFoundation
4 | //
5 | // Created by xiaoming han on 15/10/28.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AMapURLSearchConfig.h"
11 |
12 | /// 调起高德地图URL进行搜索,若是调起失败,可使用`+ (void)getLatestAMapApp;`方法获取最新版高德地图app.
13 | @interface AMapURLSearch : NSObject
14 |
15 | /// 打开高德地图AppStore页面
16 | + (void)getLatestAMapApp;
17 |
18 | /**
19 | * 调起高德地图app驾车导航.
20 | *
21 | * @param config 配置参数.
22 | *
23 | * @return 是否成功.若为YES则成功调起,若为NO则无法调起.
24 | */
25 | + (BOOL)openAMapNavigation:(AMapNaviConfig *)config;
26 |
27 | /**
28 | * 调起高德地图app进行路径规划.
29 | *
30 | * @param config 配置参数.
31 | *
32 | * @return 是否成功.
33 | */
34 | + (BOOL)openAMapRouteSearch:(AMapRouteConfig *)config;
35 |
36 | /**
37 | * 调起高德地图app进行POI搜索.
38 | *
39 | * @param config 配置参数.
40 | *
41 | * @return 是否成功.
42 | */
43 | + (BOOL)openAMapPOISearch:(AMapPOIConfig *)config;
44 |
45 | @end
46 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/android/src/main/java/com/reactnativecomponent/amaplocation/RCTAMapLocationPackage.java:
--------------------------------------------------------------------------------
1 | package com.reactnativecomponent.amaplocation;
2 |
3 |
4 | import com.facebook.react.ReactPackage;
5 | import com.facebook.react.bridge.JavaScriptModule;
6 | import com.facebook.react.bridge.NativeModule;
7 | import com.facebook.react.bridge.ReactApplicationContext;
8 | import com.facebook.react.uimanager.ViewManager;
9 |
10 | import java.util.Arrays;
11 | import java.util.Collections;
12 | import java.util.List;
13 |
14 | public class RCTAMapLocationPackage implements ReactPackage {
15 |
16 | @Override
17 | public List createNativeModules(ReactApplicationContext reactContext) {
18 | return Arrays.asList(
19 | new RCTAMapLocationModule(reactContext)
20 | );
21 | }
22 |
23 | @Override
24 | public List> createJSModules() {
25 | return Collections.emptyList();
26 | }
27 |
28 | @Override
29 | public List createViewManagers(ReactApplicationContext reactContext) {
30 | return Arrays.asList();
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapUtility.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapUtility.h
3 | // AMapFoundation
4 | //
5 | // Created by xiaoming han on 15/10/27.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | /**
13 | * 工具方法
14 | */
15 |
16 | FOUNDATION_STATIC_INLINE NSString * AMapEmptyStringIfNil(NSString *s)
17 | {
18 | return s ? s : @"";
19 | }
20 |
21 |
22 | /// 坐标类型枚举
23 | typedef NS_ENUM(NSUInteger, AMapCoordinateType)
24 | {
25 | AMapCoordinateTypeBaidu = 0, // Baidu
26 | AMapCoordinateTypeMapBar, // MapBar
27 | AMapCoordinateTypeMapABC, // MapABC
28 | AMapCoordinateTypeSoSoMap, // SoSoMap
29 | AMapCoordinateTypeAliYun, // AliYun
30 | AMapCoordinateTypeGoogle, // Google
31 | AMapCoordinateTypeGPS, // GPS
32 | };
33 |
34 | /**
35 | * 转换目标经纬度为高德坐标系
36 | *
37 | * @param coordinate 待转换的经纬度
38 | * @param type 坐标系类型
39 | *
40 | * @return 高德坐标系经纬度
41 | */
42 | FOUNDATION_EXTERN CLLocationCoordinate2D AMapCoordinateConvert(CLLocationCoordinate2D coordinate, AMapCoordinateType type);
43 |
44 | /**
45 | * 判断目标经纬度是否在大陆以及港、澳地区。输入参数为高德坐标系。
46 | *
47 | * @param coordinate 待判断的目标经纬度
48 | * @return 是否在大陆以及港、澳地区
49 | */
50 | FOUNDATION_EXTERN BOOL AMapDataAvailableForCoordinate(CLLocationCoordinate2D coordinate);
51 |
52 |
53 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapURLSearchType.h:
--------------------------------------------------------------------------------
1 | //
2 | // MAMapURLSearchType.h
3 | // MAMapKitNew
4 | //
5 | // Created by xiaoming han on 15/5/25.
6 | // Copyright (c) 2015年 xiaoming han. All rights reserved.
7 | //
8 |
9 | /// 驾车策略
10 | typedef NS_ENUM(NSInteger, AMapDrivingStrategy)
11 | {
12 | AMapDrivingStrategyFastest = 0, //速度最快
13 | AMapDrivingStrategyMinFare = 1, //避免收费
14 | AMapDrivingStrategyShortest = 2, //距离最短
15 |
16 | AMapDrivingStrategyNoHighways = 3, //不走高速
17 | AMapDrivingStrategyAvoidCongestion = 4, //躲避拥堵
18 |
19 | AMapDrivingStrategyAvoidHighwaysAndFare = 5, //不走高速且避免收费
20 | AMapDrivingStrategyAvoidHighwaysAndCongestion = 6, //不走高速且躲避拥堵
21 | AMapDrivingStrategyAvoidFareAndCongestion = 7, //躲避收费和拥堵
22 | AMapDrivingStrategyAvoidHighwaysAndFareAndCongestion = 8 //不走高速躲避收费和拥堵
23 | };
24 |
25 | /// 公交策略
26 | typedef NS_ENUM(NSInteger, AMapTransitStrategy)
27 | {
28 | AMapTransitStrategyFastest = 0,//最快捷
29 | AMapTransitStrategyMinFare = 1,//最经济
30 | AMapTransitStrategyMinTransfer = 2,//最少换乘
31 | AMapTransitStrategyMinWalk = 3,//最少步行
32 | AMapTransitStrategyMostComfortable = 4,//最舒适
33 | AMapTransitStrategyAvoidSubway = 5,//不乘地铁
34 | };
35 |
36 | /// 路径规划类型
37 | typedef NS_ENUM(NSInteger, AMapRouteSearchType)
38 | {
39 | AMapRouteSearchTypeDriving = 0, //驾车
40 | AMapRouteSearchTypeTransit = 1, //公交
41 | AMapRouteSearchTypeWalking = 2, //步行
42 | };
43 |
44 |
45 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h:
--------------------------------------------------------------------------------
1 | //
2 | // MAMapURLSearchConfig.h
3 | // MAMapKitNew
4 | //
5 | // Created by xiaoming han on 15/5/25.
6 | // Copyright (c) 2015年 xiaoming han. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 | #import "AMapURLSearchType.h"
12 |
13 | /// 导航配置信息
14 | @interface AMapNaviConfig : NSObject
15 |
16 | /// 应用返回的Scheme
17 | @property (nonatomic, copy) NSString *appScheme;
18 |
19 | /// 应用名称
20 | @property (nonatomic, copy) NSString *appName;
21 |
22 | /// 终点
23 | @property (nonatomic, assign) CLLocationCoordinate2D destination;
24 |
25 | /// 导航策略
26 | @property (nonatomic, assign) AMapDrivingStrategy strategy;
27 |
28 | @end
29 |
30 | #pragma mark -
31 |
32 | /// 路径搜索配置信息
33 | @interface AMapRouteConfig : NSObject
34 |
35 | /// 应用返回的Scheme
36 | @property (nonatomic, copy) NSString *appScheme;
37 |
38 | /// 应用名称
39 | @property (nonatomic, copy) NSString *appName;
40 |
41 | /// 起点坐标
42 | @property (nonatomic, assign) CLLocationCoordinate2D startCoordinate;
43 |
44 | /// 终点坐标
45 | @property (nonatomic, assign) CLLocationCoordinate2D destinationCoordinate;
46 |
47 | /// 驾车策略
48 | @property (nonatomic, assign) AMapDrivingStrategy drivingStrategy;
49 |
50 | /// 公交策略
51 | @property (nonatomic, assign) AMapTransitStrategy transitStrategy;
52 |
53 | /// 路径规划类型
54 | @property (nonatomic, assign) AMapRouteSearchType routeType;
55 |
56 | @end
57 |
58 | #pragma mark -
59 |
60 | /// POI搜索配置信息
61 | @interface AMapPOIConfig : NSObject
62 |
63 | /// 应用返回的Scheme
64 | @property (nonatomic, copy) NSString *appScheme;
65 |
66 | /// 应用名称
67 | @property (nonatomic, copy) NSString *appName;
68 |
69 | /// 搜索关键字
70 | @property (nonatomic, copy) NSString *keywords;
71 |
72 | /// 左上角坐标
73 | @property (nonatomic, assign) CLLocationCoordinate2D leftTopCoordinate;
74 |
75 | /// 右下角坐标
76 | @property (nonatomic, assign) CLLocationCoordinate2D rightBottomCoordinate;
77 |
78 | @end
79 |
80 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/Headers/AMapLocationRegionObj.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapLocationRegionObj.h
3 | // AMapLocationKit
4 | //
5 | // Created by AutoNavi on 15/11/27.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import "AMapLocationCommonObj.h"
10 |
11 | /// 以下类涉及的坐标需要使用高德坐标系坐标(GCJ02)
12 |
13 | #pragma mark - AMapLocationRegion
14 |
15 | /**
16 | * AMapLocationRegion类,该类提供范围类的基本信息,并无具体实现,不要直接使用。
17 | */
18 | @interface AMapLocationRegion : NSObject
19 |
20 | /**
21 | * 初始化方法
22 | *
23 | * @param identifier 唯一标识符,必填,不可为nil
24 | */
25 | - (instancetype)initWithIdentifier:(NSString *)identifier;
26 |
27 | /**
28 | * AMapLocationRegion的identifier
29 | */
30 | @property (nonatomic, copy, readonly) NSString *identifier;
31 |
32 | /**
33 | * 当进入region范围时是否通知,默认YES
34 | */
35 | @property (nonatomic, assign) BOOL notifyOnEntry;
36 |
37 | /**
38 | * 当离开region范围时是否通知,默认YES
39 | */
40 | @property (nonatomic, assign) BOOL notifyOnExit;
41 |
42 | /**
43 | * 坐标点是否在范围内
44 | *
45 | * @param coordinate 要判断的坐标点
46 | * @return 是否在范围内
47 | */
48 | - (BOOL)containsCoordinate:(CLLocationCoordinate2D)coordinate;
49 |
50 | @end
51 |
52 | #pragma mark - AMapLocationCircleRegion
53 |
54 | /**
55 | * AMapLocationCircleRegion类,定义一个圆形范围。
56 | */
57 | @interface AMapLocationCircleRegion : AMapLocationRegion
58 |
59 | /**
60 | * 根据中心点和半径生成圆形范围
61 | *
62 | * @param center 中心点的经纬度坐标
63 | * @param radius 半径,单位:米
64 | * @param identifier 唯一标识符,必填,不可为nil
65 | * @return AMapLocationCircleRegion类实例
66 | */
67 | - (instancetype)initWithCenter:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius identifier:(NSString *)identifier;
68 |
69 | /**
70 | * 中心点的经纬度坐标
71 | */
72 | @property (nonatomic, readonly) CLLocationCoordinate2D center;
73 |
74 | /**
75 | * 半径,单位:米
76 | */
77 | @property (nonatomic, readonly) CLLocationDistance radius;
78 |
79 | @end
80 |
81 | #pragma mark - AMapLocationPolygonRegion
82 |
83 | /**
84 | * AMapLocationCircleRegion类,定义一个闭合多边形范围,点与点之间按顺序尾部相连, 第一个点与最后一个点相连。
85 | */
86 | @interface AMapLocationPolygonRegion : AMapLocationRegion
87 |
88 | /**
89 | * 根据经纬度坐标数据生成闭合多边形范围
90 | *
91 | * @param coordinates 经纬度坐标点数据,coordinates对应的内存会拷贝,调用者负责该内存的释放
92 | * @param count 经纬度坐标点的个数,不可小于3个
93 | * @param identifier 唯一标识符,必填,不可为nil
94 | * @return AMapLocationCircleRegion类实例
95 | */
96 | - (instancetype)initWithCoordinates:(CLLocationCoordinate2D *)coordinates count:(NSInteger)count identifier:(NSString *)identifier;
97 |
98 | /**
99 | * 经纬度坐标点数据
100 | */
101 | @property (nonatomic, readonly) CLLocationCoordinate2D *coordinates;
102 |
103 | /**
104 | * 经纬度坐标点的个数
105 | */
106 | @property (nonatomic, readonly) NSInteger count;
107 |
108 | @end
109 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/Headers/AMapLocationCommonObj.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapLocationCommonObj.h
3 | // AMapLocationKit
4 | //
5 | // Created by AutoNavi on 15/10/22.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | /** AMapLocation errorDomain */
13 | extern NSString * const AMapLocationErrorDomain;
14 |
15 | /** AMapLocation errorCode */
16 | typedef NS_ENUM(NSInteger, AMapLocationErrorCode)
17 | {
18 | AMapLocationErrorUnknown = 1, //!< 未知错误
19 | AMapLocationErrorLocateFailed = 2, //!< 定位错误
20 | AMapLocationErrorReGeocodeFailed = 3, //!< 逆地理错误
21 | AMapLocationErrorTimeOut = 4, //!< 超时
22 | AMapLocationErrorCanceled = 5, //!< 取消
23 | AMapLocationErrorCannotFindHost = 6, //!< 找不到主机
24 | AMapLocationErrorBadURL = 7, //!< URL异常
25 | AMapLocationErrorNotConnectedToInternet = 8,//!< 连接异常
26 | AMapLocationErrorCannotConnectToHost = 9, //!< 服务器连接失败
27 | AMapLocationErrorRegionMonitoringFailure=10,//!< 地理围栏错误
28 | };
29 |
30 | /** AMapLocation Region State */
31 | typedef NS_ENUM(NSInteger, AMapLocationRegionState)
32 | {
33 | AMapLocationRegionStateUnknow = 0, //!< 未知
34 | AMapLocationRegionStateInside = 1, //!< 在范围内
35 | AMapLocationRegionStateOutside = 2, //!< 在范围外
36 | };
37 |
38 | /**
39 | * 逆地理信息
40 | */
41 | @interface AMapLocationReGeocode : NSObject
42 |
43 | @property (nonatomic, copy) NSString *formattedAddress;//!< 格式化地址
44 |
45 | @property (nonatomic, copy) NSString *country; //!< 国家
46 | @property (nonatomic, copy) NSString *province; //!< 省/直辖市
47 | @property (nonatomic, copy) NSString *city; //!< 市
48 | @property (nonatomic, copy) NSString *district; //!< 区
49 | @property (nonatomic, copy) NSString *township __attribute((deprecated("该字段从v2.2.0版本起不再返回数据,建议您使用AMapSearchKit的逆地理功能获取."))); //!< 乡镇
50 | @property (nonatomic, copy) NSString *neighborhood __attribute((deprecated("该字段从v2.2.0版本起不再返回数据,建议您使用AMapSearchKit的逆地理功能获取."))); //!< 社区
51 | @property (nonatomic, copy) NSString *building __attribute((deprecated("该字段从v2.2.0版本起不再返回数据,建议您使用AMapSearchKit的逆地理功能获取."))); //!< 建筑
52 | @property (nonatomic, copy) NSString *citycode; //!< 城市编码
53 | @property (nonatomic, copy) NSString *adcode; //!< 区域编码
54 |
55 | @property (nonatomic, copy) NSString *street; //!< 街道名称
56 | @property (nonatomic, copy) NSString *number; //!< 门牌号
57 |
58 | @property (nonatomic, copy) NSString *POIName; //!< 兴趣点名称
59 | @property (nonatomic, copy) NSString *AOIName; //!< 所属兴趣点名称
60 |
61 | @end
62 |
63 | /** AMapLocation CoordinateType */
64 | typedef NS_ENUM(NSUInteger, AMapLocationCoordinateType)
65 | {
66 | AMapLocationCoordinateTypeBaidu = 0, //!< Baidu
67 | AMapLocationCoordinateTypeMapBar, //!< MapBar
68 | AMapLocationCoordinateTypeMapABC, //!< MapABC
69 | AMapLocationCoordinateTypeSoSoMap, //!< SoSoMap
70 | AMapLocationCoordinateTypeAliYun, //!< AliYun
71 | AMapLocationCoordinateTypeGoogle, //!< Google
72 | AMapLocationCoordinateTypeGPS, //!< GPS
73 | };
74 |
75 | /**
76 | * 转换目标经纬度为高德坐标系
77 | *
78 | * @param coordinate 待转换的经纬度
79 | * @param type 坐标系类型
80 | * @return 高德坐标系经纬度
81 | */
82 | FOUNDATION_EXTERN CLLocationCoordinate2D AMapLocationCoordinateConvert(CLLocationCoordinate2D coordinate, AMapLocationCoordinateType type);
83 |
84 | /**
85 | * 判断目标经纬度是否在大陆以及港、澳地区。输入参数为高德坐标系。
86 | *
87 | * @param coordinate 待判断的目标经纬度
88 | * @return 是否在大陆以及港、澳地区
89 | */
90 | FOUNDATION_EXTERN BOOL AMapLocationDataAvailableForCoordinate(CLLocationCoordinate2D coordinate);
91 |
--------------------------------------------------------------------------------
/ios/Frameworks/AMapLocationKit.framework/Headers/AMapLocationManager.h:
--------------------------------------------------------------------------------
1 | //
2 | // AMapLocationManager.h
3 | // AMapLocationKit
4 | //
5 | // Created by AutoNavi on 15/10/22.
6 | // Copyright © 2015年 AutoNavi. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AMapLocationCommonObj.h"
11 | #import "AMapLocationRegionObj.h"
12 |
13 | /**
14 | * AMapLocatingCompletionBlock 单次定位返回Block
15 | *
16 | * @param location 定位信息
17 | * @param regeocode 逆地理信息
18 | * @param error 错误信息,参考 AMapLocationErrorCode
19 | */
20 | typedef void (^AMapLocatingCompletionBlock)(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error);
21 |
22 | @protocol AMapLocationManagerDelegate;
23 |
24 | #pragma mark - AMapLocationManager
25 |
26 | /**
27 | * AMapLocationManager类
28 | *
29 | * 初始化之前请设置 AMapLocationServices 中的APIKey,否则将无法正常使用服务.
30 | */
31 | @interface AMapLocationManager : NSObject
32 |
33 | /**
34 | * 实现了 AMapLocationManagerDelegate 协议的类指针。
35 | */
36 | @property (nonatomic, weak) id delegate;
37 |
38 | /**
39 | * 设定定位的最小更新距离。默认为 kCLDistanceFilterNone 。
40 | */
41 | @property(nonatomic, assign) CLLocationDistance distanceFilter;
42 |
43 | /**
44 | * 设定定位精度。默认为 kCLLocationAccuracyBest 。
45 | */
46 | @property(nonatomic, assign) CLLocationAccuracy desiredAccuracy;
47 |
48 | /**
49 | * 指定定位是否会被系统自动暂停。默认为YES。
50 | */
51 | @property(nonatomic, assign) BOOL pausesLocationUpdatesAutomatically;
52 |
53 | /**
54 | * 是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。
55 | *
56 | * 设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。
57 | */
58 | @property(nonatomic, assign) BOOL allowsBackgroundLocationUpdates;
59 |
60 | /**
61 | * 指定单次定位超时时间,默认为10s。最小值是2s。注意单次定位请求前设置。
62 | */
63 | @property(nonatomic, assign) NSInteger locationTimeout;
64 |
65 | /**
66 | * 指定单次定位逆地理超时时间,默认为5s。最小值是2s。注意单次定位请求前设置。
67 | */
68 | @property(nonatomic, assign) NSInteger reGeocodeTimeout;
69 |
70 | /**
71 | * 单次定位
72 | *
73 | * 如果当前正在连续定位,调用此方法将会失败,返回NO。
74 | *
75 | * 该方法将会根据设定的 desiredAccuracy 去获取定位信息。
76 | * 如果获取的定位信息精确度低于 desiredAccuracy ,将会持续的等待定位信息,直到超时后通过completionBlock返回精度最高的定位信息。
77 | *
78 | * 可以通过 stopUpdatingLocation 方法去取消正在进行的单次定位请求。
79 | *
80 | * @param withReGeocode 是否带有逆地理信息(获取逆地理信息需要联网)
81 | * @param completionBlock 单次定位完成后的Block
82 | * @return 是否成功添加单次定位Request
83 | */
84 | - (BOOL)requestLocationWithReGeocode:(BOOL)withReGeocode completionBlock:(AMapLocatingCompletionBlock)completionBlock;
85 |
86 | /**
87 | * 连续定位是否返回逆地理信息,默认NO。
88 | */
89 | @property (nonatomic, assign) BOOL locatingWithReGeocode;
90 |
91 | /**
92 | * 开始连续定位
93 | *
94 | * 调用此方法会cancel掉所有的单次定位请求。
95 | */
96 | - (void)startUpdatingLocation;
97 |
98 | /**
99 | * 停止连续定位
100 | *
101 | * 调用此方法会cancel掉所有的单次定位请求,可以用来取消单次定位。
102 | */
103 | - (void)stopUpdatingLocation;
104 |
105 | /**
106 | * 获取被监控的region集合
107 | */
108 | @property (nonatomic, readonly, copy) NSSet *monitoredRegions;
109 |
110 | /**
111 | * 开始监控指定的region
112 | *
113 | * 如果已经存在相同identifier的region,则之前的region将会被移除。
114 | * 对 AMapLocationCircleRegion 类实例,将会优先监控radius小的region。
115 | *
116 | * @param region 要被监控的范围
117 | */
118 | - (void)startMonitoringForRegion:(AMapLocationRegion *)region;
119 |
120 | /**
121 | * 停止监控指定的region
122 | *
123 | * @param region 要停止监控的范围
124 | */
125 | - (void)stopMonitoringForRegion:(AMapLocationRegion *)region;
126 |
127 | /**
128 | * 查询一个region的当前状态
129 | *
130 | * 查询结果通过amapLocationManager:didDetermineState:forRegion:回调返回
131 | *
132 | * @param region 要查询的region
133 | */
134 | - (void)requestStateForRegion:(AMapLocationRegion *)region;
135 |
136 | @end
137 |
138 | #pragma mark - AMapLocationManagerDelegate
139 |
140 | /**
141 | * AMapLocationManagerDelegate 协议
142 | *
143 | * 定义了发生错误时的错误回调方法,连续定位的回调方法等。
144 | */
145 | @protocol AMapLocationManagerDelegate
146 | @optional
147 |
148 | /**
149 | * 当定位发生错误时,会调用代理的此方法。
150 | *
151 | * @param manager 定位 AMapLocationManager 类。
152 | * @param error 返回的错误,参考 CLError 。
153 | */
154 | - (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error;
155 |
156 | /**
157 | * 连续定位回调函数
158 | *
159 | * 注意:本方法已被废弃,如果实现了amapLocationManager:didUpdateLocation:reGeocode:方法,则本方法将不会回调。
160 | *
161 | * @param manager 定位 AMapLocationManager 类。
162 | * @param location 定位结果。
163 | */
164 | - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location;
165 |
166 | /**
167 | * 连续定位回调函数
168 | *
169 | * 注意:如果实现了本方法,则定位信息不会通过amapLocationManager:didUpdateLocation:方法回调。
170 | *
171 | * @param manager 定位 AMapLocationManager 类。
172 | * @param location 定位结果。
173 | * @param reGeocode 逆地理信息。
174 | */
175 | - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode;
176 |
177 | /**
178 | * 定位权限状态改变时回调函数
179 | *
180 | * @param manager 定位 AMapLocationManager 类。
181 | * @param status 定位权限状态。
182 | */
183 | - (void)amapLocationManager:(AMapLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
184 |
185 | /**
186 | * 开始监控region回调函数
187 | *
188 | * @param manager 定位 AMapLocationManager 类。
189 | * @param region 开始监控的region。
190 | */
191 | - (void)amapLocationManager:(AMapLocationManager *)manager didStartMonitoringForRegion:(AMapLocationRegion *)region;
192 |
193 | /**
194 | * 进入region回调函数
195 | *
196 | * @param manager 定位 AMapLocationManager 类。
197 | * @param region 进入的region。
198 | */
199 | - (void)amapLocationManager:(AMapLocationManager *)manager didEnterRegion:(AMapLocationRegion *)region;
200 |
201 | /**
202 | * 离开region回调函数
203 | *
204 | * @param manager 定位 AMapLocationManager 类。
205 | * @param region 离开的region。
206 | */
207 | - (void)amapLocationManager:(AMapLocationManager *)manager didExitRegion:(AMapLocationRegion *)region;
208 |
209 | /**
210 | * 查询region状态回调函数
211 | *
212 | * @param manager 定位 AMapLocationManager 类。
213 | * @param state 查询的region的状态。
214 | * @param region 查询的region。
215 | */
216 | - (void)amapLocationManager:(AMapLocationManager *)manager didDetermineState:(AMapLocationRegionState)state forRegion:(AMapLocationRegion *)region;
217 |
218 | /**
219 | * 监控region失败回调函数
220 | *
221 | * @param manager 定位 AMapLocationManager 类。
222 | * @param region 失败的region。
223 | * @param error 错误信息,参考 AMapLocationErrorCode 。
224 | */
225 | - (void)amapLocationManager:(AMapLocationManager *)manager monitoringDidFailForRegion:(AMapLocationRegion *)region withError:(NSError *)error;
226 |
227 | @end
228 |
--------------------------------------------------------------------------------
/ios/RCTAMapLocation/RCTAMapLocation/RCTAMapLocation.m:
--------------------------------------------------------------------------------
1 |
2 | #define DefaultLocationTimeout 10
3 | #define DefaultReGeocodeTimeout 5
4 |
5 | #import "RCTAMapLocation.h"
6 | #import
7 | #import
8 | #import
9 | #import
10 | #import
11 |
12 | @interface RCTAMapLocation()
13 |
14 | @property (nonatomic, strong) AMapLocationManager *locationManager;
15 |
16 | @property (nonatomic, copy) AMapLocatingCompletionBlock completionBlock;
17 |
18 | @end
19 |
20 | @implementation RCTAMapLocation
21 |
22 | @synthesize bridge = _bridge;
23 |
24 | RCT_EXPORT_MODULE(AMapLocation);
25 |
26 | RCT_EXPORT_METHOD(init:(NSDictionary *)options)
27 | {
28 | if(self.locationManager != nil) {
29 | return;
30 | }
31 |
32 | self.locationManager = [[AMapLocationManager alloc] init];
33 |
34 | [self.locationManager setDelegate:self];
35 |
36 | [self setOptions:options];
37 |
38 | self.completionBlock = ^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error)
39 | {
40 | NSDictionary *resultDic;
41 | if (error)
42 | {
43 | resultDic = [self setErrorResult:error];
44 | }
45 | else {
46 | resultDic = [self setSuccessResult:location regeocode:regeocode];
47 | }
48 | [self.bridge.eventDispatcher sendAppEventWithName:@"amap.location.onLocationResult"
49 | body:resultDic];
50 | };
51 | }
52 |
53 | RCT_EXPORT_METHOD(setOptions:(NSDictionary *)options)
54 | {
55 | CLLocationAccuracy locationMode = kCLLocationAccuracyHundredMeters;
56 | BOOL pausesLocationUpdatesAutomatically = YES;
57 | BOOL allowsBackgroundLocationUpdates = NO;
58 | int locationTimeout = DefaultLocationTimeout;
59 | int reGeocodeTimeout = DefaultReGeocodeTimeout;
60 |
61 | if(options != nil) {
62 |
63 | NSArray *keys = [options allKeys];
64 |
65 | if([keys containsObject:@"locationMode"]) {
66 | locationMode = [[options objectForKey:@"locationMode"] doubleValue];
67 | }
68 |
69 | if([keys containsObject:@"pausesLocationUpdatesAutomatically"]) {
70 | pausesLocationUpdatesAutomatically = [[options objectForKey:@"pausesLocationUpdatesAutomatically"] boolValue];
71 | }
72 |
73 | if([keys containsObject:@"allowsBackgroundLocationUpdates"]) {
74 | allowsBackgroundLocationUpdates = [[options objectForKey:@"allowsBackgroundLocationUpdates"] boolValue];
75 | }
76 |
77 |
78 | if([keys containsObject:@"locationTimeout"]) {
79 | locationTimeout = [[options objectForKey:@"locationTimeout"] intValue];
80 | }
81 |
82 | if([keys containsObject:@"reGeocodeTimeout"]) {
83 | reGeocodeTimeout = [[options objectForKey:@"reGeocodeTimeout"] intValue];
84 | }
85 | }
86 |
87 | //设置期望定位精度
88 | [self.locationManager setDesiredAccuracy:locationMode];
89 |
90 | //设置是否允许系统暂停定位
91 | [self.locationManager setPausesLocationUpdatesAutomatically:pausesLocationUpdatesAutomatically];
92 |
93 | //设置是否允许在后台定位
94 | [self.locationManager setAllowsBackgroundLocationUpdates:allowsBackgroundLocationUpdates];
95 |
96 | //设置定位超时时间
97 | [self.locationManager setLocationTimeout:locationTimeout];
98 |
99 | //设置逆地理超时时间
100 | [self.locationManager setReGeocodeTimeout:reGeocodeTimeout];
101 |
102 | }
103 |
104 | RCT_EXPORT_METHOD(cleanUp)
105 | {
106 | //停止定位
107 | [self.locationManager stopUpdatingLocation];
108 |
109 | [self.locationManager setDelegate:nil];
110 |
111 | self.locationManager = nil;
112 | }
113 |
114 |
115 |
116 | RCT_EXPORT_METHOD(getReGeocode)
117 | {
118 | //进行单次带逆地理定位请求
119 | [self.locationManager requestLocationWithReGeocode:YES completionBlock:self.completionBlock];
120 | }
121 |
122 | RCT_EXPORT_METHOD(getLocation)
123 | {
124 | //进行单次定位请求
125 | [self.locationManager requestLocationWithReGeocode:NO completionBlock:self.completionBlock];
126 | }
127 |
128 | RCT_EXPORT_METHOD(startUpdatingLocation)
129 | {
130 | //开始进行连续定位
131 | [self.locationManager startUpdatingLocation];
132 | }
133 |
134 | RCT_EXPORT_METHOD(stopUpdatingLocation)
135 | {
136 | //停止连续定位
137 | [self.locationManager stopUpdatingLocation];
138 |
139 | }
140 |
141 | - (void)dealloc
142 | {
143 | [self cleanUp];
144 | }
145 |
146 | - (NSDictionary*)setErrorResult:(NSError *)error
147 | {
148 | NSDictionary *resultDic;
149 |
150 | resultDic = @{
151 | @"error": @{
152 | @"code": @(error.code),
153 | @"localizedDescription": error.localizedDescription
154 | }
155 | };
156 | return resultDic;
157 | }
158 |
159 | - (NSDictionary*)setSuccessResult:(CLLocation *)location regeocode:(AMapLocationReGeocode *)regeocode
160 | {
161 | NSDictionary *resultDic;
162 |
163 | //得到定位信息
164 | if (location)
165 | {
166 | if(regeocode) {
167 | resultDic = @{
168 | @"horizontalAccuracy": @(location.horizontalAccuracy),
169 | @"verticalAccuracy": @(location.verticalAccuracy),
170 | @"coordinate": @{
171 | @"latitude": @(location.coordinate.latitude),
172 | @"longitude": @(location.coordinate.longitude),
173 | },
174 | @"formattedAddress": regeocode.formattedAddress,
175 | @"country": regeocode.country,
176 | @"province": regeocode.province,
177 | @"city": regeocode.city,
178 | @"district": regeocode.district,
179 | @"citycode": regeocode.citycode,
180 | @"adcode": regeocode.adcode,
181 | @"street": regeocode.street,
182 | @"number": regeocode.number,
183 | @"POIName": regeocode.POIName,
184 | @"AOIName": regeocode.AOIName
185 | };
186 | }
187 | else {
188 | resultDic = @{
189 | @"horizontalAccuracy": @(location.horizontalAccuracy),
190 | @"verticalAccuracy": @(location.verticalAccuracy),
191 | @"coordinate": @{
192 | @"latitude": @(location.coordinate.latitude),
193 | @"longitude": @(location.coordinate.longitude),
194 | }
195 | };
196 |
197 | }
198 | }
199 | else {
200 | resultDic = @{
201 | @"error": @{
202 | @"code": @(-1),
203 | @"localizedDescription": @"定位结果不存在"
204 | }
205 | };
206 | }
207 | return resultDic;
208 | }
209 |
210 | #pragma mark - AMapLocationManager Delegate
211 |
212 | - (void)amapLocationManager:(AMapLocationManager *)manager didFailWithError:(NSError *)error
213 | {
214 | // NSLog(@"%s, amapLocationManager = %@, error = %@", __func__, [manager class], error);
215 | NSDictionary *resultDic;
216 |
217 | resultDic = [self setErrorResult:error];
218 |
219 | [self.bridge.eventDispatcher sendAppEventWithName:@"amap.location.onLocationResult"
220 | body:resultDic];
221 | }
222 |
223 | - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)regeocode
224 | {
225 | // NSLog(@"location:{lat:%f; lon:%f; accuracy:%f; regeocode:%@}", location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy, regeocode.formattedAddress);
226 |
227 | NSDictionary *resultDic;
228 |
229 | resultDic = [self setSuccessResult:location regeocode:regeocode];
230 |
231 | [self.bridge.eventDispatcher sendAppEventWithName:@"amap.location.onLocationResult"
232 | body:resultDic];
233 |
234 | }
235 |
236 |
237 | - (NSDictionary *)constantsToExport
238 | {
239 | return @{
240 | @"locationMode": @{
241 | @"bestForNavigation": @(kCLLocationAccuracyBestForNavigation),
242 | @"best": @(kCLLocationAccuracyBest),
243 | @"nearestTenMeters": @(kCLLocationAccuracyNearestTenMeters),
244 | @"hundredMeters": @(kCLLocationAccuracyHundredMeters),
245 | @"kilometer": @(kCLLocationAccuracyKilometer),
246 | @"threeKilometers": @(kCLLocationAccuracyThreeKilometers)
247 | }
248 | };
249 | }
250 |
251 |
252 | @end
253 |
--------------------------------------------------------------------------------
/ios/RCTAMapLocation/RCTAMapLocation.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 9F042C361DD56193001BA3C4 /* RCTAMapLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F042C351DD56193001BA3C4 /* RCTAMapLocation.m */; };
11 | 9F042C371DD56193001BA3C4 /* RCTAMapLocation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9F042C341DD56193001BA3C4 /* RCTAMapLocation.h */; };
12 | /* End PBXBuildFile section */
13 |
14 | /* Begin PBXCopyFilesBuildPhase section */
15 | 9F042C2F1DD56193001BA3C4 /* CopyFiles */ = {
16 | isa = PBXCopyFilesBuildPhase;
17 | buildActionMask = 2147483647;
18 | dstPath = "include/$(PRODUCT_NAME)";
19 | dstSubfolderSpec = 16;
20 | files = (
21 | 9F042C371DD56193001BA3C4 /* RCTAMapLocation.h in CopyFiles */,
22 | );
23 | runOnlyForDeploymentPostprocessing = 0;
24 | };
25 | /* End PBXCopyFilesBuildPhase section */
26 |
27 | /* Begin PBXFileReference section */
28 | 9F042C311DD56193001BA3C4 /* libRCTAMapLocation.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTAMapLocation.a; sourceTree = BUILT_PRODUCTS_DIR; };
29 | 9F042C341DD56193001BA3C4 /* RCTAMapLocation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAMapLocation.h; sourceTree = ""; };
30 | 9F042C351DD56193001BA3C4 /* RCTAMapLocation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAMapLocation.m; sourceTree = ""; };
31 | /* End PBXFileReference section */
32 |
33 | /* Begin PBXFrameworksBuildPhase section */
34 | 9F042C2E1DD56193001BA3C4 /* Frameworks */ = {
35 | isa = PBXFrameworksBuildPhase;
36 | buildActionMask = 2147483647;
37 | files = (
38 | );
39 | runOnlyForDeploymentPostprocessing = 0;
40 | };
41 | /* End PBXFrameworksBuildPhase section */
42 |
43 | /* Begin PBXGroup section */
44 | 9F042C281DD56193001BA3C4 = {
45 | isa = PBXGroup;
46 | children = (
47 | 9F042C331DD56193001BA3C4 /* RCTAMapLocation */,
48 | 9F042C321DD56193001BA3C4 /* Products */,
49 | );
50 | sourceTree = "";
51 | };
52 | 9F042C321DD56193001BA3C4 /* Products */ = {
53 | isa = PBXGroup;
54 | children = (
55 | 9F042C311DD56193001BA3C4 /* libRCTAMapLocation.a */,
56 | );
57 | name = Products;
58 | sourceTree = "";
59 | };
60 | 9F042C331DD56193001BA3C4 /* RCTAMapLocation */ = {
61 | isa = PBXGroup;
62 | children = (
63 | 9F042C341DD56193001BA3C4 /* RCTAMapLocation.h */,
64 | 9F042C351DD56193001BA3C4 /* RCTAMapLocation.m */,
65 | );
66 | path = RCTAMapLocation;
67 | sourceTree = "";
68 | };
69 | /* End PBXGroup section */
70 |
71 | /* Begin PBXNativeTarget section */
72 | 9F042C301DD56193001BA3C4 /* RCTAMapLocation */ = {
73 | isa = PBXNativeTarget;
74 | buildConfigurationList = 9F042C3A1DD56193001BA3C4 /* Build configuration list for PBXNativeTarget "RCTAMapLocation" */;
75 | buildPhases = (
76 | 9F042C2D1DD56193001BA3C4 /* Sources */,
77 | 9F042C2E1DD56193001BA3C4 /* Frameworks */,
78 | 9F042C2F1DD56193001BA3C4 /* CopyFiles */,
79 | );
80 | buildRules = (
81 | );
82 | dependencies = (
83 | );
84 | name = RCTAMapLocation;
85 | productName = RCTAMapLocation;
86 | productReference = 9F042C311DD56193001BA3C4 /* libRCTAMapLocation.a */;
87 | productType = "com.apple.product-type.library.static";
88 | };
89 | /* End PBXNativeTarget section */
90 |
91 | /* Begin PBXProject section */
92 | 9F042C291DD56193001BA3C4 /* Project object */ = {
93 | isa = PBXProject;
94 | attributes = {
95 | LastUpgradeCheck = 0810;
96 | ORGANIZATIONNAME = "react-native-component";
97 | TargetAttributes = {
98 | 9F042C301DD56193001BA3C4 = {
99 | CreatedOnToolsVersion = 8.1;
100 | ProvisioningStyle = Automatic;
101 | };
102 | };
103 | };
104 | buildConfigurationList = 9F042C2C1DD56193001BA3C4 /* Build configuration list for PBXProject "RCTAMapLocation" */;
105 | compatibilityVersion = "Xcode 3.2";
106 | developmentRegion = English;
107 | hasScannedForEncodings = 0;
108 | knownRegions = (
109 | en,
110 | );
111 | mainGroup = 9F042C281DD56193001BA3C4;
112 | productRefGroup = 9F042C321DD56193001BA3C4 /* Products */;
113 | projectDirPath = "";
114 | projectRoot = "";
115 | targets = (
116 | 9F042C301DD56193001BA3C4 /* RCTAMapLocation */,
117 | );
118 | };
119 | /* End PBXProject section */
120 |
121 | /* Begin PBXSourcesBuildPhase section */
122 | 9F042C2D1DD56193001BA3C4 /* Sources */ = {
123 | isa = PBXSourcesBuildPhase;
124 | buildActionMask = 2147483647;
125 | files = (
126 | 9F042C361DD56193001BA3C4 /* RCTAMapLocation.m in Sources */,
127 | );
128 | runOnlyForDeploymentPostprocessing = 0;
129 | };
130 | /* End PBXSourcesBuildPhase section */
131 |
132 | /* Begin XCBuildConfiguration section */
133 | 9F042C381DD56193001BA3C4 /* Debug */ = {
134 | isa = XCBuildConfiguration;
135 | buildSettings = {
136 | ALWAYS_SEARCH_USER_PATHS = NO;
137 | CLANG_ANALYZER_NONNULL = YES;
138 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
139 | CLANG_CXX_LIBRARY = "libc++";
140 | CLANG_ENABLE_MODULES = YES;
141 | CLANG_ENABLE_OBJC_ARC = YES;
142 | CLANG_WARN_BOOL_CONVERSION = YES;
143 | CLANG_WARN_CONSTANT_CONVERSION = YES;
144 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
145 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
146 | CLANG_WARN_EMPTY_BODY = YES;
147 | CLANG_WARN_ENUM_CONVERSION = YES;
148 | CLANG_WARN_INFINITE_RECURSION = YES;
149 | CLANG_WARN_INT_CONVERSION = YES;
150 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
151 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
152 | CLANG_WARN_UNREACHABLE_CODE = YES;
153 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
154 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
155 | COPY_PHASE_STRIP = NO;
156 | DEBUG_INFORMATION_FORMAT = dwarf;
157 | ENABLE_STRICT_OBJC_MSGSEND = YES;
158 | ENABLE_TESTABILITY = YES;
159 | GCC_C_LANGUAGE_STANDARD = gnu99;
160 | GCC_DYNAMIC_NO_PIC = NO;
161 | GCC_NO_COMMON_BLOCKS = YES;
162 | GCC_OPTIMIZATION_LEVEL = 0;
163 | GCC_PREPROCESSOR_DEFINITIONS = (
164 | "DEBUG=1",
165 | "$(inherited)",
166 | );
167 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
168 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
169 | GCC_WARN_UNDECLARED_SELECTOR = YES;
170 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
171 | GCC_WARN_UNUSED_FUNCTION = YES;
172 | GCC_WARN_UNUSED_VARIABLE = YES;
173 | IPHONEOS_DEPLOYMENT_TARGET = 10.1;
174 | MTL_ENABLE_DEBUG_INFO = YES;
175 | ONLY_ACTIVE_ARCH = YES;
176 | SDKROOT = iphoneos;
177 | };
178 | name = Debug;
179 | };
180 | 9F042C391DD56193001BA3C4 /* Release */ = {
181 | isa = XCBuildConfiguration;
182 | buildSettings = {
183 | ALWAYS_SEARCH_USER_PATHS = NO;
184 | CLANG_ANALYZER_NONNULL = YES;
185 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
186 | CLANG_CXX_LIBRARY = "libc++";
187 | CLANG_ENABLE_MODULES = YES;
188 | CLANG_ENABLE_OBJC_ARC = YES;
189 | CLANG_WARN_BOOL_CONVERSION = YES;
190 | CLANG_WARN_CONSTANT_CONVERSION = YES;
191 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
192 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
193 | CLANG_WARN_EMPTY_BODY = YES;
194 | CLANG_WARN_ENUM_CONVERSION = YES;
195 | CLANG_WARN_INFINITE_RECURSION = YES;
196 | CLANG_WARN_INT_CONVERSION = YES;
197 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
198 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
199 | CLANG_WARN_UNREACHABLE_CODE = YES;
200 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
201 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
202 | COPY_PHASE_STRIP = NO;
203 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
204 | ENABLE_NS_ASSERTIONS = NO;
205 | ENABLE_STRICT_OBJC_MSGSEND = YES;
206 | GCC_C_LANGUAGE_STANDARD = gnu99;
207 | GCC_NO_COMMON_BLOCKS = YES;
208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
210 | GCC_WARN_UNDECLARED_SELECTOR = YES;
211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
212 | GCC_WARN_UNUSED_FUNCTION = YES;
213 | GCC_WARN_UNUSED_VARIABLE = YES;
214 | IPHONEOS_DEPLOYMENT_TARGET = 10.1;
215 | MTL_ENABLE_DEBUG_INFO = NO;
216 | SDKROOT = iphoneos;
217 | VALIDATE_PRODUCT = YES;
218 | };
219 | name = Release;
220 | };
221 | 9F042C3B1DD56193001BA3C4 /* Debug */ = {
222 | isa = XCBuildConfiguration;
223 | buildSettings = {
224 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../../../ios/Frameworks";
225 | GCC_PREFIX_HEADER = "";
226 | HEADER_SEARCH_PATHS = (
227 | "$(inherited)",
228 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
229 | "$(SRCROOT)/../../../react-native/React/**",
230 | );
231 | LD_RUNPATH_SEARCH_PATHS = "";
232 | OTHER_LDFLAGS = "-ObjC";
233 | PRODUCT_NAME = "$(TARGET_NAME)";
234 | SKIP_INSTALL = YES;
235 | };
236 | name = Debug;
237 | };
238 | 9F042C3C1DD56193001BA3C4 /* Release */ = {
239 | isa = XCBuildConfiguration;
240 | buildSettings = {
241 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../../../ios/Frameworks";
242 | GCC_PREFIX_HEADER = "";
243 | HEADER_SEARCH_PATHS = (
244 | "$(inherited)",
245 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
246 | "$(SRCROOT)/../../../react-native/React/**",
247 | );
248 | LD_RUNPATH_SEARCH_PATHS = "";
249 | OTHER_LDFLAGS = "-ObjC";
250 | PRODUCT_NAME = "$(TARGET_NAME)";
251 | SKIP_INSTALL = YES;
252 | };
253 | name = Release;
254 | };
255 | /* End XCBuildConfiguration section */
256 |
257 | /* Begin XCConfigurationList section */
258 | 9F042C2C1DD56193001BA3C4 /* Build configuration list for PBXProject "RCTAMapLocation" */ = {
259 | isa = XCConfigurationList;
260 | buildConfigurations = (
261 | 9F042C381DD56193001BA3C4 /* Debug */,
262 | 9F042C391DD56193001BA3C4 /* Release */,
263 | );
264 | defaultConfigurationIsVisible = 0;
265 | defaultConfigurationName = Release;
266 | };
267 | 9F042C3A1DD56193001BA3C4 /* Build configuration list for PBXNativeTarget "RCTAMapLocation" */ = {
268 | isa = XCConfigurationList;
269 | buildConfigurations = (
270 | 9F042C3B1DD56193001BA3C4 /* Debug */,
271 | 9F042C3C1DD56193001BA3C4 /* Release */,
272 | );
273 | defaultConfigurationIsVisible = 0;
274 | defaultConfigurationName = Release;
275 | };
276 | /* End XCConfigurationList section */
277 | };
278 | rootObject = 9F042C291DD56193001BA3C4 /* Project object */;
279 | }
280 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # react-native-smart-amap-location
2 |
3 | [](https://www.npmjs.com/package/react-native-smart-amap-location)
4 | [](https://www.npmjs.com/package/react-native-smart-amap-location)
5 | [](https://www.npmjs.com/package/react-native-smart-amap-location)
6 | [](https://github.com/react-native-component/react-native-smart-amap-location/blob/master/LICENSE)
7 |
8 | react-native 高德地图-定位SDK 插件, 支持ios与android,
9 | 关于使用高德地图SDK, 申请应用key等详细信息请点击[这里][1]
10 |
11 | Mac下Android Studio中获取SHA1和MD5请点击[这里][3]
12 |
13 | ## 预览
14 |
15 | ![react-native-smart-amap-location-preview-ios][2]
16 |
17 | ## 安装
18 |
19 | ```
20 | npm install react-native-smart-amap-location --save
21 | ```
22 |
23 | ## Notice
24 |
25 | 这个版本仅支持react-native 0.40及以上, 如果你想使用旧的版本,使用`npm install react-native-smart-amap-location@untilRN0.40 --save`
26 |
27 |
28 | ## 安装 (iOS)
29 |
30 | * 将RCTAMapLocation.xcodeproj作为Library拖进你的Xcode里的project中.
31 |
32 | * 将RCTAMapLocation目录里Frameworks目录拖进主project目录下, 选择copy items if needed, create groups, 另外add to target不要忘记选择主project.
33 |
34 | * 点击你的主project, 选择Build Phases -> Link Binary With Libraries, 将RCTAMapLocation.xcodeproj里Product目录下的libRCTAMapLocation.a拖进去.
35 |
36 | * 同上位置, 选择Add items, 将系统库libstdc++.6.0.9.tbd加入.
37 |
38 | * 同上位置, 选择Add items, 将系统库libc++.tbd加入.
39 |
40 | * 同上位置, 选择Add items, 将系统库libz.tbd加入.
41 |
42 | * 同上位置, 选择Add items, 将系统库Security.framework加入.
43 |
44 | * 同上位置, 选择Add items, 将系统库CoreTelephony.framework加入.
45 |
46 | * 同上位置, 选择Add items, 将系统库SystemConfiguration.framework加入.
47 |
48 | * 同上位置, 选择Add items, 将系统库JavaScriptCore.framework加入.
49 |
50 | * 如需要开启后台定位, 选择Capabilities, 找到Background Modes选择ON, 勾选上Location Updates.
51 |
52 | * 选择Build Settings, 找到Header Search Paths, 确认其中包含$(SRCROOT)/../../../react-native/React, 模式为recursive.
53 |
54 | * 同上位置, 找到Framework Search Paths, 加入$(PROJECT_DIR)/Frameworks.
55 |
56 | * 点击在Libraries下已拖进来的RCTAMapLocation.xcodeproj, 选择Build Settings, 找到Framework Search Paths, 将$(SRCROOT)/../../../ios/Frameworks替换成$(SRCROOT)/../../../../ios/Frameworks.
57 |
58 | * 在`info.plist`中加入`Privacy - Location When In Use Usage Description`属性(ios 10)
59 |
60 | * 在`info.plist`中加入`Allow Arbitrary Loads`属性, 并设置值为YES(ios 10)
61 |
62 | * 在`AppDelegate.m`中
63 |
64 | ```
65 |
66 | ...
67 | #import //引入高德地图核心包
68 | ...
69 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
70 | {
71 |
72 | [AMapServices sharedServices].apiKey = @"请填写您的key"; //设置高德地图SDK服务key
73 | ...
74 | }
75 | ...
76 |
77 | ```
78 |
79 | ## 安装 (Android)
80 |
81 | * 在`android/settings.gradle`中
82 |
83 | ```
84 | ...
85 | include ':react-native-smart-amap-location'
86 | project(':react-native-smart-amap-location').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-smart-amap-location/android')
87 | ```
88 |
89 | * 在`android/app/build.gradle`中
90 |
91 | ```
92 | ...
93 | dependencies {
94 | ...
95 | // From node_modules
96 | compile project(':react-native-smart-amap-location')
97 | }
98 | ```
99 |
100 | * 在`MainApplication.java`中
101 |
102 | ```
103 | ...
104 | import com.reactnativecomponent.amaplocation.RCTAMapLocationPackage; //import package
105 | ...
106 | /**
107 | * A list of packages used by the app. If the app uses additional views
108 | * or modules besides the default ones, add more packages here.
109 | */
110 | @Override
111 | protected List getPackages() {
112 | return Arrays.asList(
113 | new MainReactPackage(),
114 | new RCTAMapLocationPackage() //register Module
115 | );
116 | }
117 | ...
118 |
119 | ```
120 |
121 | * 在`AndroidManifest.xml`中, 加入所需权限
122 |
123 | ```
124 |
125 | ...
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 | ...
161 |
162 | ```
163 |
164 | * 在`AndroidManifest.xml`中, application标签内加入
165 |
166 | ```
167 |
168 | ...
169 |
170 |
173 |
174 |
175 |
176 | ...
177 |
178 | ```
179 |
180 | ## 完整示例
181 |
182 | 点击这里 [ReactNativeComponentDemos][0]
183 |
184 | ## 使用简介
185 |
186 | Install the package from npm with `npm install react-native-smart-amap-location --save`.
187 | Then, require it from your app's JavaScript files with `import Barcode from 'react-native-smart-amap-location'`.
188 |
189 | ```js
190 | import React, {
191 | Component
192 | } from 'react'
193 | import {
194 | StyleSheet,
195 | View,
196 | Text,
197 | Alert,
198 | NativeAppEventEmitter,
199 | ActivityIndicator,
200 | ActivityIndicatorIOS,
201 | ProgressBarAndroid,
202 | } from 'react-native'
203 |
204 | import AMapLocation from 'react-native-smart-amap-location'
205 | import Button from 'react-native-smart-button'
206 | import AppEventListenerEnhance from 'react-native-smart-app-event-listener-enhance'
207 |
208 | class AMapLocationDemo extends Component {
209 |
210 | // 构造
211 | constructor(props) {
212 | super(props);
213 | // 初始状态
214 | this.state = {};
215 | }
216 |
217 | componentDidMount() {
218 | let viewAppearCallBack = (event) => {
219 | AMapLocation.init(null) //使用默认定位配置
220 | }
221 | this.addAppEventListener(
222 | this.props.navigator.navigationContext.addListener('didfocus', viewAppearCallBack),
223 | NativeAppEventEmitter.addListener('amap.location.onLocationResult', this._onLocationResult)
224 | )
225 | }
226 |
227 | componentWillUnmount () {
228 | //停止并销毁定位服务
229 | AMapLocation.cleanUp()
230 | }
231 |
232 | render() {
233 | return (
234 |
235 |
249 |
263 |
264 | )
265 | }
266 |
267 | _onLocationResult = (result) => {
268 | if(result.error) {
269 | Alert.alert(`错误代码: ${result.error.code}, 错误信息: ${result.error.localizedDescription}`)
270 | }
271 | else {
272 | if(result.formattedAddress) {
273 | Alert.alert(`格式化地址 = ${result.formattedAddress}`)
274 | }
275 | else {
276 | Alert.alert(`纬度 = ${result.coordinate.latitude}, 经度 = ${result.coordinate.longitude}`)
277 | }
278 | }
279 | if(this._button_1.state.loading) {
280 | this._button_1.setState({
281 | loading: false,
282 | })
283 | }
284 | if(this._button_2.state.loading) {
285 | this._button_2.setState({
286 | loading: false,
287 | })
288 | }
289 | }
290 |
291 | //单次定位并返回逆地理编码信息
292 | _showReGeocode = () => {
293 | this._button_1.setState({
294 | loading: true,
295 | })
296 | AMapLocation.getReGeocode()
297 | }
298 |
299 | //单次定位并返回地理编码信息
300 | _showLocation = () => {
301 | this._button_2.setState({
302 | loading: true,
303 | })
304 | AMapLocation.getLocation()
305 | }
306 |
307 | _renderActivityIndicator() {
308 | return ActivityIndicator ? (
309 |
314 | ) : Platform.OS == 'android' ?
315 | (
316 |
320 |
321 | ) : (
322 |
327 | )
328 | }
329 |
330 | }
331 |
332 | export default AppEventListenerEnhance(AMapLocationDemo)
333 | ```
334 |
335 | ## 定位配置参数 (ios)
336 | * locationOptions.locationMode 设定定位精度, 默认为百米误差内
337 | * locationOptions.pausesLocationUpdatesAutomatically 指定定位是否会被系统自动暂停。默认为YES。
338 | * locationOptions.allowsBackgroundLocationUpdates 是否允许后台定位。默认为NO。只在iOS 9.0及之后起作用。设置为YES的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。
339 | * locationOptions.locationTimeout 指定单次定位超时时间,默认为10s。最小值是2s。注意单次定位请求前设置。
340 | * locationOptions.reGeocodeTimeout 指定单次定位逆地理超时时间,默认为5s。最小值是2s。注意单次定位请求前设置。
341 |
342 | ## 定位配置参数 (android)
343 | * locationOptions.locationMode 设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
344 | * locationOptions.gpsFirst 设置是否gps优先,只在高精度模式下有效。默认关闭
345 | * locationOptions.allowsBackgroundLocationUpdates 是否允许后台定位。默认为NO
346 | * locationOptions.httpTimeout 设置网络请求超时时间。默认为30秒。在仅设备模式下无效
347 | * locationOptions.interval 设置连续定位间隔。
348 | * locationOptions.needAddress 设置是否返回逆地理地址信息。默认是true。
349 | * locationOptions.onceLocation 设置是否单次定位。默认是false
350 | * locationOptions.locationCacheEnable 设置是否开启缓存,默认为true。
351 | * locationOptions.onceLocationLatest 设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用。
352 | * locationOptions.locationProtocol 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP。
353 | * locationOptions.sensorEnable 设置是否使用传感器。默认是false。
354 |
355 | ## 方法
356 |
357 | * init
358 | * 描述: 初始化定位
359 | * 参数: locationOptions 类型: Object, 如使用默认值则传null
360 |
361 | * getReGeocode
362 | * 描述: 单次定位并返回逆地理编码信息
363 |
364 | * getLocation
365 | * 描述: 单次定位并返回地理编码信息
366 |
367 | * startUpdatingLocation
368 | * 描述: 连续定位并返回位置信息. 注:连续定位的使用请参见上述的完整示例
369 |
370 | * stopUpdatingLocation
371 | * 描述: 结束连接定位. 注:连续定位的使用请参见上述的完整示例
372 |
373 | ## 事件监听
374 |
375 | * 全局事件: amap.location.onLocationResult
376 | * 描述: 监听并获取定位信息
377 |
378 | [0]: https://github.com/cyqresig/ReactNativeComponentDemos
379 | [1]: http://lbs.amap.com/api/
380 | [2]: http://cyqresig.github.io/img/react-native-smart-amap-location-preview-ios-v1.0.0.gif
381 | [3]: http://blog.csdn.net/jackymvc/article/details/50222503
382 |
383 |
384 |
385 |
--------------------------------------------------------------------------------
/android/src/main/java/com/reactnativecomponent/amaplocation/RCTAMapLocationModule.java:
--------------------------------------------------------------------------------
1 | package com.reactnativecomponent.amaplocation;
2 |
3 |
4 | import android.app.Activity;
5 | import android.app.AlarmManager;
6 | import android.app.PendingIntent;
7 | import android.content.Context;
8 | import android.content.Intent;
9 | import android.content.IntentFilter;
10 | import android.content.BroadcastReceiver;
11 | import android.os.Handler;
12 | import android.os.Message;
13 | import android.os.SystemClock;
14 | import android.support.annotation.Nullable;
15 |
16 | import com.facebook.react.bridge.Arguments;
17 | import com.facebook.react.bridge.ReactApplicationContext;
18 | import com.facebook.react.bridge.ReactContextBaseJavaModule;
19 | import com.facebook.react.bridge.ReactMethod;
20 |
21 | import java.util.Collections;
22 | import java.util.HashMap;
23 | import java.util.Map;
24 |
25 | import com.amap.api.location.AMapLocation;
26 | import com.amap.api.location.AMapLocationClient;
27 | import com.amap.api.location.AMapLocationClientOption;
28 | import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
29 | import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;
30 | import com.amap.api.location.AMapLocationListener;
31 | import com.facebook.react.bridge.ReadableMap;
32 | import com.facebook.react.bridge.WritableMap;
33 | import com.facebook.react.modules.core.DeviceEventManagerModule;
34 |
35 |
36 | public class RCTAMapLocationModule extends ReactContextBaseJavaModule {
37 |
38 | private ReactApplicationContext reactContext;
39 |
40 | private AMapLocationClient locationClient = null;
41 | private AMapLocationClientOption locationOption = null;
42 |
43 | private Intent alarmIntent = null;
44 | private PendingIntent alarmPi = null;
45 | private AlarmManager alarm = null;
46 |
47 | private Activity currentActivity = null;
48 | private BroadcastReceiver alarmReceiver = null;
49 | private Handler mHandler = null;
50 |
51 | /**
52 | * 定位完成
53 | */
54 | private int MSG_LOCATION_FINISH = 1;
55 |
56 | private int alarmInterval = 5;
57 |
58 | public RCTAMapLocationModule(ReactApplicationContext reactContext) {
59 | super(reactContext);
60 | this.reactContext = reactContext;
61 | }
62 |
63 | @Override
64 | public String getName() {
65 | return "AMapLocation";
66 | }
67 |
68 | @ReactMethod
69 | public void init(final ReadableMap options) {
70 | if(locationClient != null) {
71 | return;
72 | }
73 | currentActivity = reactContext.getCurrentActivity();
74 | locationOption = new AMapLocationClientOption();
75 | locationOption.setOnceLocation(true); //调整为单次定位, 默认是多次
76 | //初始化client
77 | locationClient = new AMapLocationClient(getCurrentActivity());
78 | if(options != null) {
79 | setOptions(options);
80 | }
81 | // 设置定位监听
82 | locationClient.setLocationListener(locationListener);
83 | }
84 |
85 | @ReactMethod
86 | public void setOptions(final ReadableMap options){
87 | if(options.hasKey("locationMode")) {
88 | locationOption.setLocationMode(AMapLocationMode.valueOf(options.getString("locationMode")));//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
89 | }
90 | if(options.hasKey("gpsFirst")) {
91 | locationOption.setGpsFirst(options.getBoolean("gpsFirst"));//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
92 | }
93 | if(options.hasKey("httpTimeout")) {
94 | locationOption.setHttpTimeOut(options.getInt("httpTimeout"));//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
95 | }
96 | if(options.hasKey("interval")) {
97 | locationOption.setInterval(options.getInt("interval"));//可选,设置连续定位间隔。
98 | }
99 | if(options.hasKey("needAddress")) {
100 | locationOption.setNeedAddress(options.getBoolean("needAddress"));//可选,设置是否返回逆地理地址信息。默认是true
101 | }
102 | if(options.hasKey("onceLocation")) {
103 | locationOption.setOnceLocation(options.getBoolean("onceLocation"));//可选,设置是否单次定位。默认是false
104 | }
105 | if(options.hasKey("locationCacheEnable")) {
106 | locationOption.setLocationCacheEnable(options.getBoolean("locationCacheEnable"));//可选,设置是否开启缓存,默认为true.
107 | }
108 | if(options.hasKey("onceLocationLatest")) {
109 | locationOption.setOnceLocationLatest(options.getBoolean("onceLocationLatest"));//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
110 | }
111 | if(options.hasKey("locationProtocol")) {
112 | AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.valueOf(options.getString("locationProtocol")));//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
113 | }
114 | if(options.hasKey("sensorEnable")) {
115 | locationOption.setSensorEnable(options.getBoolean("sensorEnable"));//可选,设置是否使用传感器。默认是false
116 | }
117 | if(options.hasKey("allowsBackgroundLocationUpdates")
118 | && options.getBoolean("allowsBackgroundLocationUpdates")
119 | && null == mHandler) {
120 | // 创建Intent对象,action为LOCATION
121 | alarmIntent = new Intent();
122 | alarmIntent.setAction("LOCATION");
123 | IntentFilter ift = new IntentFilter();
124 |
125 | // 定义一个PendingIntent对象,PendingIntent.getBroadcast包含了sendBroadcast的动作。
126 | // 也就是发送了action 为"LOCATION"的intent
127 | alarmPi = PendingIntent.getBroadcast(currentActivity, 0, alarmIntent, 0);
128 | // AlarmManager对象,注意这里并不是new一个对象,Alarmmanager为系统级服务
129 | alarm = (AlarmManager) currentActivity.getSystemService(currentActivity.ALARM_SERVICE);
130 |
131 | //动态注册一个广播
132 | IntentFilter filter = new IntentFilter();
133 | filter.addAction("LOCATION");
134 |
135 | alarmReceiver = new BroadcastReceiver(){
136 | @Override
137 | public void onReceive(Context context, Intent intent) {
138 | if(intent.getAction().equals("LOCATION")){
139 | if(null != locationClient){
140 | locationClient.startLocation();
141 | }
142 | }
143 | }
144 | };
145 |
146 | currentActivity.registerReceiver(alarmReceiver, filter);
147 |
148 | mHandler = new Handler() {
149 | public void dispatchMessage(android.os.Message msg) {
150 | if (msg.what == MSG_LOCATION_FINISH) {
151 | AMapLocation location = (AMapLocation) msg.obj;
152 | WritableMap resultMap = setResultMap(location);
153 | reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
154 | .emit("amap.location.onLocationResult", resultMap);
155 | }
156 | };
157 | };
158 | }
159 | //设置定位参数
160 | locationClient.setLocationOption(locationOption);
161 | }
162 |
163 | @ReactMethod
164 | public void getReGeocode() {
165 | locationOption.setNeedAddress(true); //可选,设置是否返回逆地理地址信息。默认是true
166 | // 设置定位参数
167 | locationClient.setLocationOption(locationOption);
168 | // 启动定位
169 | locationClient.startLocation();
170 | }
171 |
172 | @ReactMethod
173 | public void getLocation() {
174 | locationOption.setNeedAddress(false); //可选,设置是否返回逆地理地址信息。默认是true
175 | // 设置定位参数
176 | locationClient.setLocationOption(locationOption);
177 | // 启动定位
178 | locationClient.startLocation();
179 | }
180 |
181 | @ReactMethod
182 | public void startUpdatingLocation() {
183 | locationClient.startLocation();
184 |
185 | if(null != alarm){
186 | //设置一个闹钟,2秒之后每隔一段时间执行启动一次定位程序
187 | alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 2 * 1000,
188 | alarmInterval * 1000, alarmPi);
189 | }
190 | }
191 |
192 | @ReactMethod
193 | public void stopUpdatingLocation() {
194 | locationClient.stopLocation();
195 |
196 | //停止定位的时候取消闹钟
197 | if(null != alarm){
198 | alarm.cancel(alarmPi);
199 | }
200 | }
201 |
202 | @ReactMethod
203 | public void cleanUp() {
204 | if (null != locationClient) {
205 | locationClient.stopLocation();
206 | locationClient.onDestroy();
207 | locationClient = null;
208 | locationOption = null;
209 | }
210 | if(null != alarmReceiver && null != currentActivity){
211 | currentActivity.unregisterReceiver(alarmReceiver);
212 | alarmReceiver = null;
213 | }
214 | if(null != mHandler) {
215 | mHandler = null;
216 | }
217 | }
218 |
219 | private WritableMap setResultMap(AMapLocation location) {
220 | WritableMap resultMap = Arguments.createMap();
221 | if (null != location) {
222 | //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
223 | if(location.getErrorCode() == 0){
224 | WritableMap coordinateMap = Arguments.createMap();
225 | coordinateMap.putDouble("longitude", location.getLongitude());
226 | coordinateMap.putDouble("latitude", location.getLatitude());
227 | resultMap.putMap("coordinate", coordinateMap);
228 | resultMap.putInt("locationType", location.getLocationType());
229 | resultMap.putDouble("accuracy", location.getAccuracy());
230 | resultMap.putDouble("locationType", location.getAccuracy());
231 | resultMap.putString("provider", location.getProvider());
232 | if (location.getProvider().equalsIgnoreCase(
233 | android.location.LocationManager.GPS_PROVIDER)) {
234 | // 以下信息只有提供者是GPS时才会有
235 | resultMap.putDouble("speed", location.getSpeed());
236 | resultMap.putDouble("bearing", location.getBearing());
237 | // 获取当前提供定位服务的卫星个数
238 | resultMap.putInt("satellites", location.getSatellites());
239 | } else {
240 | // 提供者是GPS时是没有以下信息的
241 | resultMap.putString("country", location.getCountry());
242 | resultMap.putString("province", location.getProvince());
243 | resultMap.putString("city", location.getCity());
244 | resultMap.putString("citycode", location.getCityCode());
245 | resultMap.putString("district", location.getDistrict());
246 | resultMap.putString("adcode", location.getAdCode());
247 | resultMap.putString("formattedAddress", location.getAddress());
248 | resultMap.putString("street", location.getStreet());
249 | resultMap.putString("number", location.getStreetNum());
250 | resultMap.putString("POIName", location.getPoiName());
251 | resultMap.putString("AOIName", location.getAoiName());
252 | }
253 | }
254 | else {
255 | WritableMap errorMap = Arguments.createMap();
256 | errorMap.putInt("code", location.getErrorCode());
257 | errorMap.putString("localizedDescription", location.getErrorInfo());
258 | resultMap.putMap("error", errorMap);
259 | }
260 | } else {
261 | WritableMap errorMap = Arguments.createMap();
262 | errorMap.putInt("code", -1);
263 | errorMap.putString("localizedDescription", "定位结果不存在");
264 | resultMap.putMap("error", errorMap);
265 | }
266 |
267 | return resultMap;
268 | }
269 |
270 | AMapLocationListener locationListener = new AMapLocationListener() {
271 | @Override
272 | public void onLocationChanged(AMapLocation location) {
273 | if(null == mHandler) {
274 | WritableMap resultMap = setResultMap(location);
275 | reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
276 | .emit("amap.location.onLocationResult", resultMap);
277 | }
278 | else {
279 | Message msg = mHandler.obtainMessage();
280 | msg.obj = location;
281 | msg.what = MSG_LOCATION_FINISH;
282 | mHandler.sendMessage(msg);
283 | }
284 | }
285 | };
286 |
287 | @Nullable
288 | @Override
289 | public Map getConstants() {
290 | return Collections.unmodifiableMap(new HashMap() {
291 | {
292 | put("locationMode", getLocationModeTypes());
293 | put("locationProtocol", getLocationProtocolTypes());
294 | }
295 | private Map getLocationModeTypes() {
296 | return Collections.unmodifiableMap(new HashMap() {
297 | {
298 | put("batterySaving", String.valueOf(AMapLocationMode.Battery_Saving));
299 | put("deviceSensors", String.valueOf(AMapLocationMode.Device_Sensors));
300 | put("hightAccuracy", String.valueOf(AMapLocationMode.Hight_Accuracy));
301 | }
302 | });
303 | }
304 | private Map getLocationProtocolTypes() {
305 | return Collections.unmodifiableMap(new HashMap() {
306 | {
307 | put("http", String.valueOf(AMapLocationProtocol.HTTP));
308 | put("https", String.valueOf(AMapLocationProtocol.HTTPS));
309 | }
310 | });
311 | }
312 | });
313 | }
314 |
315 | }
316 |
317 |
--------------------------------------------------------------------------------