#pragma mark - 地图上显示多边形
- (MKPolygon*)showPolygonInMap:(CLLocationCoordinate2D*)coordinates count:(NSInteger)count {
MKPolygon *polygonOverlay = [MKPolygon polygonWithCoordinates:coordinates count:count];
[self.mapView addOverlay:polygonOverlay];
return polygonOverlay;
}
#pragma mark - 清除上一次按钮点击创建的围栏
- (void)doClear {
[self.mapView removeOverlays:self.mapView.overlays]; //把之前添加的Overlay都移除掉
[self.geoFenceManager removeAllGeoFenceRegions]; //移除所有已经添加的围栏,如果有正在请求的围栏也会丢弃
}
#pragma mark - 添加多边形围栏
- (void)GeoFence{
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[[NetworkManager sharedManager] POSTWithURLString:ElectronFence parameters:parameters success:^(id responseObject) {
NSDictionary *userDic = responseObject[@"result"];
NSArray* fenceList = userDic[@"fenceList"];
[fenceList enumerateObjectsUsingBlock:^(NSDictionary * dic, NSUInteger idx, BOOL * _Nonnull stop) {
NSArray *array = dic[@"detail"];
CLLocationCoordinate2D *coorArr = malloc(sizeof(CLLocationCoordinate2D) * array.count);
for(inti =0; i < array.count; i++) {
CGFloatlongitude = [array[i][@"longitude"] doubleValue];
CGFloatlatitude = [array[i][@"latitude"] doubleValue];
coorArr[i] = CLLocationCoordinate2DMake(latitude, longitude);
}
[self doClear];
self.geoFenceManager.activeAction = AMapGeoFenceActiveActionInside | AMapGeoFenceActiveActionOutside | AMapGeoFenceActiveActionStayed; //监听进入、退出、停留事件
[self.geoFenceManager addPolygonRegionForMonitoringWithCoordinates:coorArr count:array.count customID:@"polygon_1"];
free(coorArr); //malloc,使用后,记得free
coorArr =NULL;
}];
}failure:^(NSError*error) {
NSLog(@"%@",error);
[self doClear];
self.geoFenceManager.activeAction = AMapGeoFenceActiveActionInside | AMapGeoFenceActiveActionOutside | AMapGeoFenceActiveActionStayed; //监听进入、退出、停留事件
}];
}
#pragma mark - 添加地理围栏完成后的回调
- (void)amapGeoFenceManager:(AMapGeoFenceManager*)manager didAddRegionForMonitoringFinished:(NSArray *)regions customID:(NSString*)customID error:(NSError*)error {
if([customIDisEqualToString:@"polygon_1"]){
if(error) {
NSLog(@"=======polygon error %@",error);
}else{ //围栏添加后,在地图上的显示,只是为了更方便的演示,并不是必须的.
AMapGeoFencePolygonRegion *polygonRegion = (AMapGeoFencePolygonRegion *)regions.firstObject;
MKPolygon *polygonOverlay = [self showPolygonInMap:polygonRegion.coordinatescount:polygonRegion.count];
[self.mapView setVisibleMapRect:polygonOverlay.boundingMapRect edgePadding:UIEdgeInsetsMake( -50, 120, 120, 120) animated:NO];
}
}
}
#pragma mark - 地理围栏状态改变时回调
- (void)amapGeoFenceManager:(AMapGeoFenceManager*)manager didGeoFencesStatusChangedForRegion:(AMapGeoFenceRegion*)region customID:(NSString*)customID error:(NSError*)error {
if(error) {
NSLog(@"status changed error %@",error);
}else{
NSLog(@"status changed %@",[regiondescription]);
}
switch(region.fenceStatus) {
case AMapGeoFenceRegionStatusInside:
{
//在区域内
NSLog(@"在 区域内");
}
break;
case AMapGeoFenceRegionStatusOutside:
{
//在区域外
NSLog(@"在 区域外");
/////围栏报警超出区域
[self player];
}
break;
case AMapGeoFenceRegionStatusStayed:
{
//停留超过十分钟
}
break;
default: {
//未知
NSLog(@"在 未知");
}
break;
}
}
- (void) player {
//本地音乐播放
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"超出围栏(王老师)" ofType:@"mp3"];
NSURL*url = [NSURL fileURLWithPath:filePath];
palyer = [[AVPlayer alloc] initWithURL:url];
[palyer play];
}
网友评论