Ios 使用多个信标(在每个不同的信标上弹出一个视图)

Ios 使用多个信标(在每个不同的信标上弹出一个视图),ios,objective-c,ibeacon,estimote,Ios,Objective C,Ibeacon,Estimote,我是目标C的初学者。 我的应用程序使用一个信标就可以正常工作。 我正在使用“estimote SDK”。 我有很多问题,我想使用2或3个信标。我想为每个信标推送一个视图 我不明白我怎么能用多个信标 我不知道是否必须使用多个信标管理器。(ESTBeaconManager*beaconManager) 我不知道如何将不同的区域传递给DidRange信标:(NSArray*)区域中的信标:(ESTBeaconRegion*)区域 我可以只使用一个信标进行通知,当我接近它们时,使用另外两个信标弹出两个不

我是目标C的初学者。 我的应用程序使用一个信标就可以正常工作。 我正在使用“estimote SDK”。 我有很多问题,我想使用2或3个信标。我想为每个信标推送一个视图

我不明白我怎么能用多个信标

  • 我不知道是否必须使用多个信标管理器。(ESTBeaconManager*beaconManager)

  • 我不知道如何将不同的区域传递给DidRange信标:(NSArray*)区域中的信标:(ESTBeaconRegion*)区域

  • 我可以只使用一个信标进行通知,当我接近它们时,使用另外两个信标弹出两个不同的视图。(每个信标有一个不同的视图)

  • 谢谢你的帮助

    致以最良好的祝愿

    代码:

    我一开始不使用大调或小调

    在视图中,我执行以下操作:

    [self.beaconManager startRangingBeaconsInRegion:region];
    
    代表如下所示:

    -(void)beaconManager:(ESTBeaconManager *)manager
         didRangeBeacons:(NSArray *)beacons
                inRegion:(ESTBeaconRegion *)region
    {
    
    // I used a sort , sorting by distance
        NSSortDescriptor *sortDescriptor;
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    
    // if breakpoint here 3 beacons in array
        self.beaconsArray = [beacons sortedArrayUsingDescriptors:sortDescriptors];
    
        if([self.beaconsArray count] > 0)
        {
    
            if(!self.selectedBeacon)
            {
                // initialy pick closest beacon
                self.selectedBeacon = [beacons objectAtIndex:0];
                currentBeaconMinor = self.selectedBeacon.minor;
            }
            else
            {
                for (ESTBeacon* cBeacon in self.beaconsArray)
                {
                    // update beacon it same as selected initially
                    if([self.selectedBeacon.major unsignedShortValue] == [cBeacon.major unsignedShortValue] &&
                       [self.selectedBeacon.minor unsignedShortValue] == [cBeacon.minor unsignedShortValue])
                    {
                        self.selectedBeacon = cBeacon;
                        currentBeaconMinor = self.selectedBeacon.minor;
                    }
                }
            }
    
    switch (self.selectedBeacon.proximity)
            {
    
                case CLProximityImmediate:
                {
    
                    if ([currentBeaconMinor floatValue] == 128)
                    {
                        NSLog(@"128 128 128");
                        //[self performSegueWithIdentifier: @"presentSegue1" sender: self];
                    }
    
                    else if ([currentBeaconMinor floatValue] == 228)
                    {
                        NSLog(@"228 228 228");
                        //[self performSegueWithIdentifier: @"presentSegue2" sender: self];
                    }
                    else if ([currentBeaconMinor floatValue] == 328)
                    {
                        NSLog(@"328 328 328");
                        //[self performSegueWithIdentifier: @"presentSegue3" sender: self];
                    }
    
                    break;
                }
    
    我按距离排序,有一个currentBeaconMinor值。我的信标阵列中有3个信标,如果我放置一个断点,我可以看到3个

    在接近开关时,我会这样做:

    -(void)beaconManager:(ESTBeaconManager *)manager
         didRangeBeacons:(NSArray *)beacons
                inRegion:(ESTBeaconRegion *)region
    {
    
    // I used a sort , sorting by distance
        NSSortDescriptor *sortDescriptor;
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    
    // if breakpoint here 3 beacons in array
        self.beaconsArray = [beacons sortedArrayUsingDescriptors:sortDescriptors];
    
        if([self.beaconsArray count] > 0)
        {
    
            if(!self.selectedBeacon)
            {
                // initialy pick closest beacon
                self.selectedBeacon = [beacons objectAtIndex:0];
                currentBeaconMinor = self.selectedBeacon.minor;
            }
            else
            {
                for (ESTBeacon* cBeacon in self.beaconsArray)
                {
                    // update beacon it same as selected initially
                    if([self.selectedBeacon.major unsignedShortValue] == [cBeacon.major unsignedShortValue] &&
                       [self.selectedBeacon.minor unsignedShortValue] == [cBeacon.minor unsignedShortValue])
                    {
                        self.selectedBeacon = cBeacon;
                        currentBeaconMinor = self.selectedBeacon.minor;
                    }
                }
            }
    
    switch (self.selectedBeacon.proximity)
            {
    
                case CLProximityImmediate:
                {
    
                    if ([currentBeaconMinor floatValue] == 128)
                    {
                        NSLog(@"128 128 128");
                        //[self performSegueWithIdentifier: @"presentSegue1" sender: self];
                    }
    
                    else if ([currentBeaconMinor floatValue] == 228)
                    {
                        NSLog(@"228 228 228");
                        //[self performSegueWithIdentifier: @"presentSegue2" sender: self];
                    }
                    else if ([currentBeaconMinor floatValue] == 328)
                    {
                        NSLog(@"328 328 328");
                        //[self performSegueWithIdentifier: @"presentSegue3" sender: self];
                    }
    
                    break;
                }
    

    但这仍然不起作用:(((我很生气。我的应用程序最初选择了最近的信标。之后,应用程序始终保持相同的信标并且从不更改。我将信标移到设备附近,但nslog始终发送相同的次要号码。请您给我一些帮助,我确定我做错了什么。

    我以前没有使用Estimote SDK。我只是处理我的Estimote bea。)与香草iBeacons一样,使用Apple的Location Manager框架

    我觉得你很困惑

    我简单地看了一下Estimote SDK,它看起来非常类似于苹果的位置管理器

    在位置管理器中,您创建一个信标区域,然后要求位置管理器开始对该信标区域进行测距(这会告诉您估计的距离读数,或者您使用startMonitoringForRegion要求获得有关进入/退出区域事件的通知)

    你可以同时做这两件事。看一下估算API,它们似乎使用了相同的方法

    您需要创建一个信标区域,然后调用StarTrangBeaconsisnRegion和/或startMonitoringForRegion以请求范围和/或进入/退出区域通知

    然后,当信标进入/退出范围(startMonitoringForRegion)或更改距离(StartRangingBeaconsisnRegion)时,等待调用委托方法

    查看文档,似乎调用requestStateForRegion会导致Estimote beacon管理器调用您的locationManager:didDetermineState:forRegion:delegate方法一次且仅一次

    在代码中,您没有要求监视区域或范围信标,因此所有3个区域都将返回“不在范围内”状态


    不要调用这些requestStateForRegion。调用startMonitoringForRegion和/或StartTransingBeaConsonRegion,等待系统在信标状态更改时通知您。

    每个信标有3条信息-UUID、主号码和次号码。创建信标区域时,必须至少指定UUID。您可以a可选指定主值和次值。iOS将在后台扫描的信标区域数量有限制(我相信是20个),因此通常最好在区域注册中尽可能广泛,然后在收到通知时确定您是否对可见的信标感兴趣

    所有Estimote信标都具有相同的UUID,因此,如果您仅使用UUID注册一个区域,则每当您在任何Estimote信标的范围内时,您的应用程序都会收到通知。我可以看到,您的三个信标都使用MARY 12800,因此您可以简单地创建一个指定UUID和MARY的区域,然后每当出现beac时,您都会收到通知在上,这些值是可见的-或者您可以像以前一样为三个信标中的每一个注册特定区域

    您只需要一个
    EstBeaconManager
    实例来管理所有区域

    无论何时您进入或退出一个区域,都将调用您的
    didEnterRegion
    didextregion
    方法。如果您当前正在测距信标,也将调用您的
    didRangeBeacons
    方法

    在这些委托方法中,您需要检查major和minor(实际上只是minor,因为在您的情况下,major总是相同的)值,以确定要执行的操作。您还可以检查区域标识符字符串以确定哪个信标可见

    请注意,范围内可能有多个信标,因此您可能需要检查近邻以确定要采取的操作

    最后,尽管您定义了这三个区域,但您并没有对它们全部进行测距/监视,因此将
    视图更改为

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.beaconManager startRangingBeaconsInRegion:region];
        [self.beaconManager startMonitoringForRegion:region];
    
        [self.beaconManager startRangingBeaconsInRegion:region2];
        [self.beaconManager startMonitoringForRegion:region2];
    
        [self.beaconManager startRangingBeaconsInRegion:region3];
        [self.beaconManager startMonitoringForRegion:region3];
    
    
    }
    

    您对标识符的意思是这样的吗?(void)beaconManager:(ESTBeaconManager*)manager didEnterRegion:(ESTBeaconRegion*)region{if([region.identifier IsequalString:@“firstRegionIdentifier”]){//Do something}如果([region.identifier IsequalString:@“secondRegionIdentifier”]){//do this}}是的,或者你可以查看minor的数值你有一个名为“region”的实例变量和一个名为“region”的局部变量-重命名其中一个。非常感谢你的帮助,我编写了我的代码,但我在数组“beacons”中始终有相同的信标(我使用了断点):
    -(void)信标管理器:(ESTBeaconManager*)管理器DidRange信标:(NSArray*)区域中的信标:(ESTBeaconRegion*)区域{if([Beacon count]>0){//do something}
    阵列仅包含区域1的信标,我有区域2和3,但即使我将信标移开,它也会检测到相同的信标。此外,我需要对该阵列进行排序,以便能够为每个信标推送不同的视图(即时)。您已经