Триггерные представления с несколькими ibeacon

Я разрабатываю приложение для iPad, которое использует более одного маяка, и мне нужно показывать вид при входе в его регион, затем, когда я нахожусь рядом с маяком и далеко от другого, мне нужен первый закройте и откройте второй.

Мой код такой:

    -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    CLBeacon *beacon = [[CLBeacon alloc] init];
    beacon = [beacons lastObject];


    SectionViewController *sectionView = [[SectionViewController alloc] init];
    Sections2ViewController *sectionView2 = [[Sections2ViewController alloc] init];

    if ((beacon.proximity == CLProximityImmediate) && viewShown == NO && beacon.accuracy != -1.000000) {

        if ((beacon.minor.integerValue != actualSection) && actualSection != 0) {
            [self dismissViewControllerAnimated:NO completion:nil];
            actualSection = 0;
            NSLog(@"View Out");
        }

        if (beacon.minor.integerValue  == 1) {
            [self presentViewController:sectionView animated:NO completion:nil];
            sectionView.section = 1;
            actualSection = 1;
            sectionView.lbl_name.text = self.lbl_name.text;
            NSLog(@"View In: 1");
            viewShown = YES;
        }else if (beacon.minor.integerValue == 2){
            [self presentViewController:sectionView2 animated:NO completion:nil];
            sectionView.section = 2;
            actualSection = 2;
            NSLog(@"View In: 2");
            viewShown = YES;
        }
    }else if ((beacon.proximity == CLProximityNear || beacon.proximity == CLProximityFar) && viewShown == YES && beacon.accuracy != -1.000000){
        [self dismissViewControllerAnimated:NO completion:nil];
        viewShown = NO;
    }else{
        NSLog(@"Unknown Distance");
    }

    NSLog(@"\nUUID: %@\nProximity:%ld\nMajor:%@\nMinor:%@\nAccuracy:%f\nRSSI:%ld\nSection: %ld", beacon.proximityUUID.UUIDString, beacon.proximity, beacon.major, beacon.minor, beacon.accuracy, (long)beacon.rssi, (long)self.section);
}
  • sectionView и SectionView2 - это представления, которые я хочу показать.

  • Я использую viewShown, чтобы знать, если представление представлено или я в mainView.

  • Фактический раздел должен знать, где я.

Проблема в том, что, если я использую только 1 маяк, он работает отлично, но когда я делаю это с 2, приложение не обнаруживает их обоих, и трудно показать правильный вид.

Я пытаюсь это сейчас, но приложение обнаруживает только 1 маяк, и я использую один и тот же UUID на обоих из них и меняя только незначительное значение.

Я сейчас использую ios 7.0.4 на сетчатке iPad Mini, но скоро обновлюсь до iOS 7.1 - это проблема?


Решено:

    - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void)initRegion {
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"00000000-0000-0000-0000-000000000002"];
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.devfright.myRegion"];
    [self.locationManager startMonitoringForRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Beacon Found");
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"Left Region");
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    CLBeacon *beacon = [[CLBeacon alloc] init];
    beacon = [beacons lastObject];

    //Search for the closest and show the view
    for (int i=0; i<beacons.count; i++) {
        beacon = beacons[i];

        if (beacon.proximity == CLProximityUnknown) {
            NSLog(@"Unknown Proximity");
        } else if ((beacon.proximity == CLProximityImmediate) && viewShown == NO && beacon.accuracy != -1.000000) {
            if ([beacon.minor.stringValue  isEqual: @"1"]) {
                actualSection = 1;
                [self immediateDetection];
            }else if ([beacon.minor.stringValue  isEqual: @"2"]){
                actualSection = 2;
                [self immediateDetection];
            }else if ([beacon.minor.stringValue  isEqual: @"3"]){
                actualSection = 3;
                [self immediateDetection];
            }else if ([beacon.minor.stringValue  isEqual: @"4"]){
                actualSection = 4;
                [self immediateDetection];
            }
        } else if ((beacon.proximity == CLProximityNear || beacon.proximity == CLProximityFar) && viewShown == YES && beacon.accuracy != -1.000000) {
            if (beacon.minor.integerValue == actualSection) {
                [self dismissViewControllerAnimated:NO completion:nil];
                actualSection = 0;
                viewShown = NO;
            }
        } else if (beacon.proximity == CLProximityFar) {
            NSLog(@"Far");
        }
    }
}
- (void)immediateDetection
{
    viewShown = YES;
    if (self.presentedViewController)
    {
        return;
    }
    if (actualSection == 1) {
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 1;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 2){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 2;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }
}

Теперь это правильно и определить близкого. Спасибо

0 ответов

Другие вопросы по тегам