├── 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 | [![npm](https://img.shields.io/npm/v/react-native-smart-amap-location.svg)](https://www.npmjs.com/package/react-native-smart-amap-location) 4 | [![npm](https://img.shields.io/npm/dm/react-native-smart-amap-location.svg)](https://www.npmjs.com/package/react-native-smart-amap-location) 5 | [![npm](https://img.shields.io/npm/dt/react-native-smart-amap-location.svg)](https://www.npmjs.com/package/react-native-smart-amap-location) 6 | [![npm](https://img.shields.io/npm/l/react-native-smart-amap-location.svg)](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 | --------------------------------------------------------------------------------