Ios 使用多个信标(在每个不同的信标上弹出一个视图)
我是目标C的初学者。 我的应用程序使用一个信标就可以正常工作。 我正在使用“estimote SDK”。 我有很多问题,我想使用2或3个信标。我想为每个信标推送一个视图 我不明白我怎么能用多个信标Ios 使用多个信标(在每个不同的信标上弹出一个视图),ios,objective-c,ibeacon,estimote,Ios,Objective C,Ibeacon,Estimote,我是目标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,但即使我将信标移开,它也会检测到相同的信标。此外,我需要对该阵列进行排序,以便能够为每个信标推送不同的视图(即时)。您已经