我在玩 Corelocation 和 iBeacons。我在进入和退出一个区域时触发了通知,我可以对我的信标进行范围等。这一切都很好。
但是我陷入了混乱。我想在靠近特定信标时加载第二个视图,然后在我们离开该信标时关闭该视图,冲洗并重复第二个信标。
我正在努力:
由于测距没有停止,如何停止触发视图变化。如果我手动停止测距或使用 bool 来测试我是否已经在第二个视图中,这没关系,但看起来很乱。
如果我离开信标,如何关闭视图。要做到这一点,我想我不能停止测距,否则我不知道我是否搬走了。
我的代码如下。
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewDidAppear:(BOOL)animated {
// Setup Beacon Manager
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
NSUUID *uuid = [[NSUUID alloc]initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"];
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"Beacon Region"];
[self.locationManager startMonitoringForRegion:self.beaconRegion];
[self.locationManager requestStateForRegion:self.beaconRegion];
self.beaconStatLabel.text = @"StartLocationServices";
//check to see if this is the first time we've run the app
if ([[NSUserDefaults standardUserDefaults] floatForKey:@"tBHasRun"] == 0) {
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"tBHasRun"]; //set the time run to 1
[self performSegueWithIdentifier:@"firstRunSegue" sender:self];
self.beaconStatLabel.text = @"FIRST RUN"; //set the label text
} else {
self.beaconStatLabel.text = @"REPEAT RUN"; //set the label text
}
}
//Looking for and dealing with regions
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
//looking for a region means looking for a beacon or set of beacons that share a UUID
[self.locationManager requestStateForRegion:self.beaconRegion];
}
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
//if we found a region we start ranging (looking for beaocns)
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
self.regionState.text = @"Region Entered";
//we'll also test sending a notification
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Welcome! Go upstairs, bring beer.";
notification.soundName = UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
//we have left the region so we'll stop ranging
[self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
self.regionState.text = @"Region Exited";
//we'll also test sending a notification
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Thankyou for coming. For information on our next MeetUp check our MeetUp page.";
notification.soundName = UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
//dealing with individual beacons
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
//once beacons are ranged we enter this method
//we'll grab and log the signal strength of the beacons
for (int i = 0; i < [beacons count]; i++) {
CLBeacon *singleBeacon = [[CLBeacon alloc]init];
singleBeacon = [beacons objectAtIndex:i];
}
//we get the latest beacon in the array - the closest beacon (strongest signal)
CLBeacon *beacon = [[CLBeacon alloc] init];
beacon = [beacons lastObject];
//update the info labels
self.uuidLabel.text = beacon.proximityUUID.UUIDString;
self.majorLabel.text = [NSString stringWithFormat:@"%@", beacon.major];
self.minorLabel.text = [NSString stringWithFormat:@"%@", beacon.minor];
//we store some information about that beacon
NSNumber *beaconMajor = beacon.major; //it's major (group) number
NSNumber *beaconMinor = beacon.minor; //it's minor (individual) number
//we then call the manageBeacon method and pass through the minor, major, and proximity values
[self manageBeaconWithMinor:beaconMinor AndMajor:beaconMajor AtRange:beacon.proximity];
}
- (void)manageBeaconWithMinor:(NSNumber *)minorNumber AndMajor:(NSNumber *)majorNumber AtRange:(CLProximity)proximity {
//in this method we work out what do do based upon the beacon we are connected to and the range
//for this test we'll look for the mint beacon and call a view
if (([minorNumber floatValue] == 59204) && ([majorNumber floatValue] == 33995) && (proximity == CLProximityNear)) {
//we are going to open up content
[[tBGlobalStore sharedInstance]setInContentTrue];
NSLog([[tBGlobalStore sharedInstance] getInContent] ? @"Yes" : @"No");
//the beacon numbers match the beacon we are expecting so we'll call the next screen
[self performSegueWithIdentifier:@"mainToContent" sender:self];
}
}
来自控制台的一些附加信息,您可以看到它试图多次调用视图。
2013-11-22 15:24:56.487 测试信标[670:60b] --- 2013-11-22 15:24:56.489 测试信标[670:60b] ----- 2013-11-22 15:24:56.490 testingBeacons[670:60b] 信标位于:2013-11-22 15:24:56.490 testingBeacons[670:60b] 0 2013-11-22 15:24:56.491 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:24:56.492 testingBeacons[670:60b] -75 2013-11-22 15:24:56.492 testingBeacons[670:60b] ----- 2013-11-22 15:24:56.493 testingBeacons[670:60b ] --- 2013-11-22 15:24:56.495 testingBeacons[670:60b] 警告:尝试显示不在窗口层次结构中的视图!2013-11-22 15:24:56.497 测试信标[670:60b] --- 2013-11-22 15:24:56.498 测试信标[670:60b] ----- 2013-11-22 15:24:56.498 testingBeacons[670:60b] 信标位于:2013-11-22 15:24:56.499 testingBeacons[670:60b] 0 2013-11-22 15:24:56.499 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 时 15 分 24 分 56 秒。500 个测试信标[670:60b] -75 2013-11-22 15:24:56.500 测试信标[670:60b] ----- 2013-11-22 15:24:56.501 测试信标[670:60b] --- 2013 -11-22 15:24:57.487 testingBeacons[670:60b] --- 2013-11-22 15:24:57.489 testingBeacons[670:60b] ----- 2013-11-22 15:24:57.489 testingBeacon [670:60b] 信标位于:2013-11-22 15:24:57.490 testingBeacons[670:60b] 0 2013-11-22 15:24:57.490 testingBeacons[670:60b] 的 RSSI 为:2013-11-22 15:24:57.491 测试信标[670:60b] -75 2013-11-22 15:24:57.491 测试信标[670:60b] ----- 2013-11-22 15:24:57.492 测试信标[670:60b] --- 2013-11-22 15:24:57.493 testingBeacons[670:60b] 警告:尝试显示不在窗口层次结构中的视图!2013-11-22 15:24:57.495 测试信标[670:60b] --- 2013-11-22 15:24:57.495 测试信标[670:60b] ----- 2013-11-22 15:24:57.496 testingBeacons[670:60b] 信标在:2013-11-22 15:24:57.496 testingBeacons[670:60b] 0 2013-11-22 15:24:57.497 testingBeacons[670:60b] 的 RSSI 为:2013-11-22 15:24:57.497 testingBeacons[670 :60b] -75 2013-11-22 15:24:57.498 测试信标[670:60b] ----- 2013-11-22 15:24:57.499 测试信标[670:60b] --- 2013-11-22 15:24:57.500 testingBeacons[670:60b] 警告:尝试呈现不在窗口层次结构中的视图!2013-11-22 15:24:58.488 测试信标[670:60b] --- 2013-11-22 15:24:58.489 测试信标[670:60b] ----- 2013-11-22 15:24:58.490 testingBeacons[670:60b] 信标位于:2013-11-22 15:24:58.490 testingBeacons[670:60b] 0 2013-11-22 15:24:58.491 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:24:58.491 测试信标[670:60b] -76 2013-11-22 15:24:58.492 测试信标[670:60b] ----- 2013-11-22 15:24:58.492 测试信标[670:60b ] --- 2013-11-22 15:24:58。493 testingBeacons[670:60b] 警告:尝试显示不在窗口层次结构中的视图!2013-11-22 15:24:58.494 测试信标[670:60b] --- 2013-11-22 15:24:58.495 测试信标[670:60b] ----- 2013-11-22 15:24:58.496 testingBeacons[670:60b] 信标位于:2013-11-22 15:24:58.496 testingBeacons[670:60b] 0 2013-11-22 15:24:58.497 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:24:58.497 testingBeacons[670:60b] -76 2013-11-22 15:24:58.498 testingBeacons[670:60b] ----- 2013-11-22 15:24:58.499 testingBeacons[670:60b ] --- 2013-11-22 15:24:58.500 testingBeacons[670:60b] 警告:尝试显示不在窗口层次结构中的视图!2013-11-22 15:24:59.488 测试信标[670:60b] --- 2013-11-22 15:24:59.489 测试信标[670:60b] ----- 2013-11-22 15:24:59.489 testingBeacons[670:60b] 信标于:2013-11-22 15:24:59。490 testingBeacons[670:60b] 0 2013-11-22 15:24:59.490 testingBeacons[670:60b] 的 RSSI 为:2013-11-22 15:24:59.491 testingBeacons[670:60b] -75 2013-11- 22 15:24:59.491 testingBeacons[670:60b] ----- 2013-11-22 15:24:59.492 testingBeacons[670:60b] --- 2013-11-22 15:24:59.493 testingBeacons[670: 60b] 警告:尝试呈现不在窗口层次结构中的视图!2013-11-22 15:24:59.494 测试信标[670:60b] --- 2013-11-22 15:24:59.495 测试信标[670:60b] ----- 2013-11-22 15:24:59.495 testingBeacons[670:60b] 信标位于:2013-11-22 15:24:59.496 testingBeacons[670:60b] 0 2013-11-22 15:24:59.496 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:24:59.497 测试信标[670:60b] -75 2013-11-22 15:24:59.498 测试信标[670:60b] ----- 2013-11-22 15:24:59.498 测试信标[670:60b ] --- 2013-11-22 15:24:59.500 测试信标[670: 60b] 警告:尝试呈现不在窗口层次结构中的视图!2013-11-22 15:25:00.487 测试信标[670:60b] --- 2013-11-22 15:25:00.488 测试信标[670:60b] ----- 2013-11-22 15:25:00.489 testingBeacons[670:60b] 信标位于:2013-11-22 15:25:00.489 testingBeacons[670:60b] 0 2013-11-22 15:25:00.490 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:25:00.490 测试信标[670:60b] -75 2013-11-22 15:25:00.491 测试信标[670:60b] ----- 2013-11-22 15:25:00.491 测试信标[670:60b ] --- 2013-11-22 15:25:00.492 testingBeacons[670:60b] 警告:尝试显示不在窗口层次结构中的视图!2013-11-22 15:25:00.493 测试信标[670:60b] --- 2013-11-22 15:25:00.494 测试信标[670:60b] ----- 2013-11-22 15:25:00.494 testingBeacons[670:60b] 信标位于:2013-11-22 15:25:00.495 testingBeacons[670: 60b] 0 2013-11-22 15:25:00.495 testingBeacons[670:60b] 的 RSSI 为:2013-11-22 15:25:00.496 testingBeacons[670:60b] -75 2013-11-22 15:25: 00.496 testingBeacons[670:60b] ----- 2013-11-22 15:25:00.497 testingBeacons[670:60b] --- 2013-11-22 15:25:00.498 testingBeacons[670:60b] 警告:尝试呈现不在窗口层次结构中的视图!2013-11-22 15:25:01.488 测试信标[670:60b] --- 2013-11-22 15:25:01.489 测试信标[670:60b] ----- 2013-11-22 15:25:01.489 testingBeacons[670:60b] 信标位于:2013-11-22 15:25:01.490 testingBeacons[670:60b] 0 2013-11-22 15:25:01.490 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:25:01.491 testingBeacons[670:60b] -72 2013-11-22 15:25:01.492 testingBeacons[670:60b] ----- 2013-11-22 15:25:01.492 testingBeacons[670:60b ] --- 2013-11-22 15:25:01.493 testingBeacons[670:60b] 警告:尝试呈现不在窗口层次结构中的视图!2013-11-22 15:25:01.494 测试信标[670:60b] --- 2013-11-22 15:25:01.495 测试信标[670:60b] ----- 2013-11-22 15:25:01.495 testingBeacons[670:60b] 信标位于:2013-11-22 15:25:01.496 testingBeacons[670:60b] 0 2013-11-22 15:25:01.497 testingBeacons[670:60b] 的 RSSI 为:2013-11- 22 15:25:01.497 testingBeacons[670:60b] -72 2013-11-22 15:25:01.498 testingBeacons[670:60b] ----- 2013-11-22 15:25:01.498 testingBeacons[670:60b ] --- 2013-11-22 15:25:01.499 testingBeacons[670:60b] 警告:尝试呈现不在窗口层次结构中的视图!