How to know the closest iBeacon

后端 未结 3 1691
無奈伤痛
無奈伤痛 2021-01-06 07:22

I have a code to know which beacon is the closest, but I have a problem when a beacon\'s accuracy is -1.00000, the the app takes the second one.

So there is a bucle

3条回答
  •  情歌与酒
    2021-01-06 08:00

    First of all: Replace your long else/if of locationManager:didRangeBeacons:inRegion: with:

    if (([closestBeacon.minor intValue] > 0 && [closestBeacon.minor intValue] <= 11) || [closestBeacon.minor intValue] == 30)
    {
        actualSection = [closestBeacon.minor intValue]; 
        [self immediateDetection];
    }
    

    Replace your long else/if in immediateDetection with:

    if ((actualSection > 0 && actualSection < 10 || actualSection == 30)
    {
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = actualSection;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }
    else if (actualSection == 10 || actualSection == 11)
    {
        ThiefAlarmViewController *thiefAlarmView = [[ThiefAlarmViewController alloc] init];
        [self presentViewController:thiefAlarmView animated:NO completion:nil];
    }
    else
    {
    }
    

    That should save you a lot of code.

    For your issue, you could to this:

        NSPredicate *predicateIrrelevantBeacons = [NSPredicate predicateWithFormat:@"(self.accuracy != -1) AND ((self.proximity != %d) OR (self.proximity != %d))", CLProximityFar,CLProximityUnknown];
    NSArray *relevantsBeacons = [beacons filteredArrayUsingPredicate: predicateIrrelevantBeacons];
        NSPredicate *predicateMin = [NSPredicate predicateWithFormat:@"self.accuracy == %@.@min.accuracy", relevantsBeacons];
    
        CLBeacon *closestBeacon = nil;
        NSArray *closestArray = [[relevantsBeacons filteredArrayUsingPredicate:predicateMin];
        if ([closestArray count] > 0)
            closestBeacon = [closestArray objectAtIndex:0];
       if (closestBeacon)
       { //Do your thing }
       else
       {//No relevant close beacon}
    

提交回复
热议问题