Commit 065c2f0e authored by 7c00's avatar 7c00

实现 iOS 步行、骑行导航

parent 633d5e78
import React, {Component} from 'react' import React, {Component} from 'react'
import {StyleSheet} from 'react-native' import {StyleSheet} from 'react-native'
import {Navigation} from 'react-native-amap3d' import {Drive} from 'react-native-amap3d'
export default class NavigationExample extends Component { export default class NavigationExample extends Component {
static navigationOptions = { static navigationOptions = {
...@@ -8,7 +8,7 @@ export default class NavigationExample extends Component { ...@@ -8,7 +8,7 @@ export default class NavigationExample extends Component {
} }
componentDidMount() { componentDidMount() {
this._navigation.calculateDriveRoute( this._navigation.calculateRoute(
{ {
latitude: 39.906901, latitude: 39.906901,
longitude: 116.397972, longitude: 116.397972,
...@@ -20,10 +20,10 @@ export default class NavigationExample extends Component { ...@@ -20,10 +20,10 @@ export default class NavigationExample extends Component {
) )
} }
_start = () => this._navigation.start() _start = () => {}
render() { render() {
return <Navigation return <Drive
ref={ref => this._navigation = ref} ref={ref => this._navigation = ref}
style={StyleSheet.absoluteFill} style={StyleSheet.absoluteFill}
onCalculateRouteSuccess={this._start} onCalculateRouteSuccess={this._start}
......
#import <AMapNaviKit/AMapNaviDriveView.h> #import <AMapNaviKit/AMapNaviDriveView.h>
#import <React/RCTComponent.h> #import <React/RCTComponent.h>
@interface AMapNavigation : AMapNaviDriveView @interface AMapDrive : AMapNaviDriveView
@property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteSuccess; @property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteSuccess;
@property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteFailure;
@end @end
\ No newline at end of file
#import "AMapDrive.h"
@implementation AMapDrive {
}
@end
\ No newline at end of file
#import <React/RCTUIManager.h> #import <React/RCTUIManager.h>
#import <AMapNaviKit/AMapNaviDriveView.h> #import <AMapNaviKit/AMapNaviDriveView.h>
#import <AMapNaviKit/AMapNaviDriveManager.h> #import <AMapNaviKit/AMapNaviDriveManager.h>
#import "AMapNavigation.h" #import "AMapDrive.h"
#pragma ide diagnostic ignored "OCUnusedClassInspection" #pragma ide diagnostic ignored "OCUnusedClassInspection"
@interface AMapNavigationManager : RCTViewManager <AMapNaviDriveManagerDelegate> @interface AMapDriveManager : RCTViewManager <AMapNaviDriveManagerDelegate>
+ (AMapNavigation *)driveView; + (AMapDrive *)driveView;
+ (AMapNaviDriveManager *)driveManager; + (AMapNaviDriveManager *)driveManager;
@end @end
@implementation AMapNavigationManager { @implementation AMapDriveManager {
AMapNavigation *_driveView; AMapDrive *_driveView;
AMapNaviDriveManager *_driveManager; AMapNaviDriveManager *_driveManager;
} }
- (instancetype)init { - (instancetype)init {
if (self = [super init]) { if (self = [super init]) {
_driveView = [AMapNavigationManager driveView]; _driveView = [AMapDriveManager driveView];
_driveManager = [AMapNavigationManager driveManager]; _driveManager = [AMapDriveManager driveManager];
_driveManager.delegate = self; _driveManager.delegate = self;
} }
return self; return self;
...@@ -27,8 +27,9 @@ ...@@ -27,8 +27,9 @@
RCT_EXPORT_MODULE() RCT_EXPORT_MODULE()
RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteSuccess, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteSuccess, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteFailure, RCTBubblingEventBlock)
RCT_EXPORT_METHOD(calculateDriveRoute:(nonnull NSNumber *)reactTag start:(AMapNaviPoint *)start endPoints:(AMapNaviPoint *)end) { RCT_EXPORT_METHOD(calculateRoute:(nonnull NSNumber *)reactTag start:(AMapNaviPoint *)start end:(AMapNaviPoint *)end way:(NSArray<AMapNaviPoint *> *)way) {
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) { [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
[_driveManager calculateDriveRouteWithStartPoints:@[start] [_driveManager calculateDriveRouteWithStartPoints:@[start]
endPoints:@[end] endPoints:@[end]
...@@ -53,19 +54,27 @@ RCT_EXPORT_METHOD(start:(nonnull NSNumber *)reactTag) { ...@@ -53,19 +54,27 @@ RCT_EXPORT_METHOD(start:(nonnull NSNumber *)reactTag) {
} }
} }
- (void)driveManager:(AMapNaviDriveManager *)driveManager onCalculateRouteFailure:(NSError *)error {
if (_driveView.onCalculateRouteFailure) {
_driveView.onCalculateRouteFailure(@{
@"code": @(error.code),
});
}
}
+ (AMapNaviDriveManager *)driveManager { + (AMapNaviDriveManager *)driveManager {
static AMapNaviDriveManager *driveManager; static AMapNaviDriveManager *driveManager;
if (driveManager == nil) { if (driveManager == nil) {
driveManager = [AMapNaviDriveManager new]; driveManager = [AMapNaviDriveManager new];
[driveManager addDataRepresentative:[AMapNavigationManager driveView]]; [driveManager addDataRepresentative:[AMapDriveManager driveView]];
} }
return driveManager; return driveManager;
} }
+ (AMapNavigation *)driveView { + (AMapDrive *)driveView {
static AMapNavigation *driveView; static AMapDrive *driveView;
if (driveView == nil) { if (driveView == nil) {
driveView = [AMapNavigation new]; driveView = [AMapDrive new];
} }
return driveView; return driveView;
} }
......
#import "AMapNavigation.h"
@implementation AMapNavigation {
}
@end
\ No newline at end of file
#import <AMapNaviKit/AMapNaviRideView.h>
#import <React/RCTComponent.h>
@interface AMapRide : AMapNaviRideView
@property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteSuccess;
@property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteFailure;
@end
\ No newline at end of file
#import "AMapRide.h"
@implementation AMapRide {
}
@end
\ No newline at end of file
#import <React/RCTUIManager.h>
#import <AMapNaviKit/AMapNaviRideView.h>
#import <AMapNaviKit/AMapNaviRideManager.h>
#import "AMapRide.h"
#pragma ide diagnostic ignored "OCUnusedClassInspection"
@interface AMapRideManager : RCTViewManager <AMapNaviRideManagerDelegate>
+ (AMapRide *)rideView;
+ (AMapNaviRideManager *)rideManager;
@end
@implementation AMapRideManager {
AMapRide *_rideView;
AMapNaviRideManager *_rideManager;
}
- (instancetype)init {
if (self = [super init]) {
_rideView = [AMapRideManager rideView];
_rideManager = [AMapRideManager rideManager];
_rideManager.delegate = self;
}
return self;
}
RCT_EXPORT_MODULE()
RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteSuccess, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteFailure, RCTBubblingEventBlock)
RCT_EXPORT_METHOD(calculateRoute:(nonnull NSNumber *)reactTag start:(AMapNaviPoint *)start end:(AMapNaviPoint *)end) {
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
[_rideManager calculateRideRouteWithStartPoint:start
endPoint:end];
}];
}
RCT_EXPORT_METHOD(start:(nonnull NSNumber *)reactTag) {
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
[_rideManager startGPSNavi];
}];
}
- (UIView *)view {
return _rideView;
}
- (void)rideManagerOnCalculateRouteSuccess:(AMapNaviRideManager *)rideManager {
if (_rideView.onCalculateRouteSuccess) {
_rideView.onCalculateRouteSuccess(nil);
}
}
- (void)rideManager:(AMapNaviRideManager *)rideManager onCalculateRouteFailure:(NSError *)error {
if (_rideView.onCalculateRouteFailure) {
_rideView.onCalculateRouteFailure(@{
@"code": @(error.code),
});
}
}
+ (AMapNaviRideManager *)rideManager {
static AMapNaviRideManager *rideManager;
if (rideManager == nil) {
rideManager = [AMapNaviRideManager new];
[rideManager addDataRepresentative:[AMapRideManager rideView]];
}
return rideManager;
}
+ (AMapRide *)rideView {
static AMapRide *rideView;
if (rideView == nil) {
rideView = [AMapRide new];
}
return rideView;
}
@end
#import <AMapNaviKit/AMapNaviWalkView.h>
#import <React/RCTComponent.h>
@interface AMapWalk : AMapNaviWalkView
@property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteSuccess;
@property(nonatomic, copy) RCTBubblingEventBlock onCalculateRouteFailure;
@end
\ No newline at end of file
#import "AMapWalk.h"
@implementation AMapWalk {
}
@end
\ No newline at end of file
#import <React/RCTUIManager.h>
#import <AMapNaviKit/AMapNaviWalkView.h>
#import <AMapNaviKit/AMapNaviWalkManager.h>
#import "AMapWalk.h"
#pragma ide diagnostic ignored "OCUnusedClassInspection"
@interface AMapWalkManager : RCTViewManager <AMapNaviWalkManagerDelegate>
+ (AMapWalk *)walkView;
+ (AMapNaviWalkManager *)walkManager;
@end
@implementation AMapWalkManager {
AMapWalk *_walkView;
AMapNaviWalkManager *_walkManager;
}
- (instancetype)init {
if (self = [super init]) {
_walkView = [AMapWalkManager walkView];
_walkManager = [AMapWalkManager walkManager];
_walkManager.delegate = self;
}
return self;
}
RCT_EXPORT_MODULE()
RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteSuccess, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onCalculateRouteFailure, RCTBubblingEventBlock)
RCT_EXPORT_METHOD(calculateRoute:(nonnull NSNumber *)reactTag start:(AMapNaviPoint *)start end:(AMapNaviPoint *)end) {
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
[_walkManager calculateWalkRouteWithStartPoints:@[start]
endPoints:@[end]];
}];
}
RCT_EXPORT_METHOD(start:(nonnull NSNumber *)reactTag) {
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
[_walkManager startGPSNavi];
}];
}
- (UIView *)view {
return _walkView;
}
- (void)walkManagerOnCalculateRouteSuccess:(AMapNaviWalkManager *)walkManager {
if (_walkView.onCalculateRouteSuccess) {
_walkView.onCalculateRouteSuccess(nil);
}
}
- (void)walkManager:(AMapNaviWalkManager *)walkManager onCalculateRouteFailure:(NSError *)error {
if (_walkView.onCalculateRouteFailure) {
_walkView.onCalculateRouteFailure(@{
@"code": @(error.code),
});
}
}
+ (AMapNaviWalkManager *)walkManager {
static AMapNaviWalkManager *walkManager;
if (walkManager == nil) {
walkManager = [AMapNaviWalkManager new];
[walkManager addDataRepresentative:[AMapWalkManager walkView]];
}
return walkManager;
}
+ (AMapWalk *)walkView {
static AMapWalk *walkView;
if (walkView == nil) {
walkView = [AMapWalk new];
}
return walkView;
}
@end
...@@ -39,5 +39,6 @@ RCT_ENUM_CONVERTER(MAPinAnnotationColor, (@{ ...@@ -39,5 +39,6 @@ RCT_ENUM_CONVERTER(MAPinAnnotationColor, (@{
} }
RCT_ARRAY_CONVERTER(Coordinate) RCT_ARRAY_CONVERTER(Coordinate)
RCT_ARRAY_CONVERTER(AMapNaviPoint)
@end @end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment