Commit 6aa74889 authored by 7c00's avatar 7c00
Browse files

简单实现 ios 离线地图模块

parent 63f76e72
Loading
Loading
Loading
Loading

ios/AMapOffline.m

0 → 100644
+102 −0
Original line number Original line Diff line number Diff line
#import <React/RCTBridgeModule.h>
#import <MAMapKit/MAOfflineMap.h>

#pragma ide diagnostic ignored "OCUnusedClassInspection"

@interface AMapOffline : NSObject <RCTBridgeModule>
@end

@implementation AMapOffline

RCT_EXPORT_MODULE()

RCT_REMAP_METHOD(getProvinces,
            resolveProvinces: (RCTPromiseResolveBlock) resolve
            reject: (RCTPromiseRejectBlock) reject) {
    NSMutableArray *provinces = [NSMutableArray new];
    for (id item in MAOfflineMap.sharedOfflineMap.provinces) {
        MAOfflineProvince *province = (MAOfflineProvince *) item;

        NSMutableArray *cities = [NSMutableArray new];
        for (id city in province.cities) {
            [cities addObject:[self itemData:(MAOfflineCity *) city]];
        }

        [provinces addObject:@{
                @"name": province.name,
                @"size": @(province.size),
                @"state": [self stateString:province.itemStatus],
                @"cities": cities,
        }];
    }
    for (id item in MAOfflineMap.sharedOfflineMap.municipalities) {
        [provinces addObject:[self itemData:item]];
    }
    resolve(provinces);
}

RCT_REMAP_METHOD(getCities,
            resolveCities: (RCTPromiseResolveBlock) resolve
            reject: (RCTPromiseRejectBlock) reject) {
    NSMutableArray *cities = [NSMutableArray new];
    for (id city in MAOfflineMap.sharedOfflineMap.cities) {
        [cities addObject:[self itemData:(MAOfflineCity *) city]];
    }
    resolve(cities);
}

RCT_EXPORT_METHOD(download:(NSString *)name) {
    MAOfflineItem *item = [self getItem:name];
    if (item != nil) {
        [MAOfflineMap.sharedOfflineMap downloadItem: item
              shouldContinueWhenAppEntersBackground:YES
                                      downloadBlock:nil];
    }
}

- (MAOfflineItem *)getItem:(NSString *)name {
    BOOL (^predicate)(MAOfflineItem *, NSUInteger, BOOL *)=^BOOL (MAOfflineItem * item, NSUInteger _, BOOL *stop) {
        return [name isEqual:item.name];
    };

    NSUInteger i = [MAOfflineMap.sharedOfflineMap.provinces indexOfObjectPassingTest:predicate];
    if (i != NSNotFound) {
        return MAOfflineMap.sharedOfflineMap.provinces[i];
    }

    i = [MAOfflineMap.sharedOfflineMap.municipalities indexOfObjectPassingTest:predicate];
    if (i != NSNotFound) {
        return MAOfflineMap.sharedOfflineMap.municipalities[i];
    }

    i = [MAOfflineMap.sharedOfflineMap.cities indexOfObjectPassingTest:predicate];
    if (i != NSNotFound) {
        return MAOfflineMap.sharedOfflineMap.cities[i];
    }

    return nil;
}

- (NSString *)stateString:(MAOfflineItemStatus)code {
    NSString *state = @"";
    if (code == MAOfflineItemStatusCached) {
        state = @"downloading";
    }
    if (code == MAOfflineItemStatusExpired) {
        state = @"expired";
    }
    if (code == MAOfflineItemStatusInstalled) {
        state = @"downloaded";
    }
    return state;
}

- (NSDictionary *)itemData:(MAOfflineCity *)city {
    return @{
            @"name": city.name,
            @"size": @(city.size),
            @"state": [self stateString:city.itemStatus],
    };
}

@end
+1 −1
Original line number Original line Diff line number Diff line
@@ -4,5 +4,5 @@ const {AMapOffline} = NativeModules
export default {
export default {
  getProvinces: () => AMapOffline.getProvinces(),
  getProvinces: () => AMapOffline.getProvinces(),
  getCities: () => AMapOffline.getCities(),
  getCities: () => AMapOffline.getCities(),
  download: name => AMapOffline.getDownload(name),
  download: name => AMapOffline.download(name),
}
}