地理围栏不发送通知 (iOS)

Posted

技术标签:

【中文标题】地理围栏不发送通知 (iOS)【英文标题】:Geofencing don't send a notification (iOS) 【发布时间】:2016-01-20 15:57:09 【问题描述】:

每次用户经过我客户的商店(大约 1700 家商店)时,我都会尝试发送通知,但它不起作用。

谁能告诉我为什么?

我的代码:

Store.m

-(CLCircularRegion*)createCircularRegion

    CLCircularRegion *region=[[CLCircularRegion alloc] initWithCenter:self.geoPoint radius:1000 identifier:self.identifier];

    region.notifyOnEntry=YES;

    return region;

viewController.m

-(void)startMonitoringAllStores

    if (![CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) 
        NSLog(@"Monitoring is not available for CLCircularRegion class");
    

    for (Store *currentStore in self.allStores) 
        CLCircularRegion *region=[currentStore createCircularRegion];
        [self.locationManager startMonitoringForRegion:region];
    


-(void)getStoresFromParse

    [self findObjectsWithClassName:@"Stores"];

    [self.allStores addObjectsFromArray:self.allStores];

    [self startMonitoringAllStores];

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    self.locationManager.delegate=self;
    [self.locationManager requestAlwaysAuthorization];

    return YES;



-(void)handleRegionEvent:(CLRegion*)region

    NSLog(@"Geofence triggered");



-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region

    if ([region isKindOfClass:[CLCircularRegion class]]) 
        [self handleRegionEvent:region];
    

【问题讨论】:

通知相关的代码在哪里? @Mr.T 哦,忘了。更新帖子,谢谢! 【参考方案1】:

您在 ios 中只能同时监控 20 个位置。见Apple's documentation。另外,请确保您通过requestAlwaysAuthorization 请求许可。

绕过此限制的一种方法是找到离用户最近的 19 家商店并监控这些区域,然后使用第 20 区域作为围绕用户当前位置的外边界,其半径是到第 19 家商店的距离。当用户越过外边界时,重新计算最近的 19 家商店和边界,并重复。在代码中,你会做这样的事情。 (请注意,我没有测试此代码;这只是一个示例。)

- (void)installClosestGeofencesTo:(CLLocation *)currentLocation 
    [self removeAllGeofences];
    NSArray *closestStores = [self findClosestStoresTo:currentLocation limit:19];
    for (Store *store in closestStores) 
        CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:store.location radius:100 identifier:store.identifier];
        [self.locationManager startMonitoringForRegion:region];
    
    Store *furthestStore = [closestStores lastObject];
    CLCircularRegion *boundaryRegion = [[CLCircularRegion alloc] initWithCenter:currentLocation.coordinate radius:furthestStore.distance identifier:@"boundary"];
    [self.locationManager startMonitoringForRegion:boundaryRegion];


- (void)removeAllGeofences 
    NSArray *monitoredRegions = [self.locationManager monitoredRegions];
    for (CLRegion *region in monitoredRegions) 
        [self.locationManager stopMonitoringForRegion:region];
    


- (NSArray *)findStoresClosestTo:(CLLocation *)location limit:(NSUInteger)limit 
    ...

在您的CLLocationManagerDelegate 中,您可以执行以下操作:

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region

    if ([region.identifier isEqual:@"boundary"]) 
        [self installClosestGeofencesTo:self.locationManager.location];
    

【讨论】:

我该怎么做?你能给我一个代码示例吗?谢谢! 放一些代码就行了。不确定它有多完整,但希望这能让您大致了解我的意思。 谢谢!我会尝试,但我不认为这是这里的问题,即使我进入第一个/最后一个商店区域也不会通知。你有没有看到其他可能导致这种情况的事情?

以上是关于地理围栏不发送通知 (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

iOS蓝色状态栏同时使用地理围栏/背景位置更新来触发通知

如何在 iOS 中禁用/启用本地通知?

处理公共区域的多个地理围栏过渡

如何提高 Android 地理围栏进入/退出通知的一致性?

如何自定义谷歌地图以接收特定位置的通知

使用 iOS 地理围栏跟踪多个(20 多个)位置