gpt4 book ai didi

ios - 来自 didEnterRegion : 的多个本地通知故障

转载 作者:行者123 更新时间:2023-11-28 21:41:44 26 4
gpt4 key购买 nike

我目前正在监控几个由核心数据支持的地点。换句话说,我已经设置了一个 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];
}

最佳答案

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

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//把你的代码放在这里

关于ios - 来自 didEnterRegion : 的多个本地通知故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com