0

我目前正在监视由核心数据支持的几个位置。换句话说,我设置了一个 for 循环,循环遍历核心数据中所有存储的实体,并为所有实体创建一个受监控的区域。

这里的问题是,当进入一个区域时,for 循环会触发多个本地通知。通知的数量几乎直接对应于监控区域的数量。所以我相当有信心这可能是导致错误的原因,但我不是 100% 确定。

我注意到这似乎是区域监控的一个常见问题,但我一直找不到包含 for 循环的示例。

如何在调用 didEnterRegion 时停止触发多个通知?

下面的方法在 viewDidLoad 中被调用。[DataSource sharedInstance].fetchedResultItems 是一个数组,其中填充了来自已获取请求的 fetchedObjects。

-(void)startMonitoringRegions{
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [self.locationManager requestWhenInUseAuthorization];

        CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
        if (authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
            authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {
            self.locationManager.distanceFilter = 10;
            [self.locationManager startUpdatingLocation];

            for (POI *items in [DataSource sharedInstance].fetchResultItems){

                NSString *poiName = items.name;
                NSNumber *poiLatitude = items.yCoordinate;
                NSLog(@"value: %@", poiLatitude);
                NSNumber *poiLongitude = items.xCoordinate;
                NSLog(@"value: %@", poiLongitude);

                NSString *identifier = poiName;
                CLLocationDegrees latitude = [poiLatitude floatValue];
                CLLocationDegrees longitude = [poiLongitude floatValue];
                CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
                self.regionRadius = 10;

                self.region =  [[CLCircularRegion alloc] initWithCenter:centerCoordinate radius:400 identifier:identifier];
                [self.locationManager startMonitoringForRegion:self.region];
                NSLog(@"region: %@", self.region);
                NSLog(@"monitored regions %@", self.locationManager.monitoredRegions);

            }
        }
    }
}

这是 didEnterRegion 方法

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"entered region!!");
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];

    if (localNotification) {
        localNotification.fireDate = nil;
        localNotification.alertBody = [NSString stringWithFormat:@"You are near %@", self.region.identifier];
        localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];
        localNotification.timeZone = [NSTimeZone defaultTimeZone];
    }
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
//    [[UIApplication sharedApplication]presentLocalNotificationNow:localNotification];
}
4

2 回答 2

2

区域充当共享资源。当您进入任何区域时,呼叫将被转接到所有位置经理。我认为您正在以某种方式创建多个位置管理器对象。这实际上导致了 didEnterRegion 的多次调用。调用 didEnterRegion 的次数取决于您注册的 LocationManager 的数量。您应该在 AppDelegate 中编写代码,在此方法中

  • (BOOL)应用程序:(UIApplication *)应用程序 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//把你的代码放在这里

}

于 2015-08-10T17:23:17.610 回答
0

只是一个故障排除提示。您可以使用以下等效的 Obj-C 来查看应用程序当前正在监视哪些区域。或许查看标识符可以对问题有所了解。

for region in locationManager.monitoredRegions {
            debugPrint(region.identifier)
}

为了一个干净的开始,您可以使用以下命令删除所有区域:

for region in locationManager.monitoredRegions {
            locationManager.stopMonitoringForRegion(region)
}
于 2015-08-10T17:51:42.527 回答