Eileen Wen
Published © Apache-2.0

Bluetooth iBeacon

iBeacon is a precise micro-positioning technology based on Bluetooth 4.0 (Bluetooth LE | BLE | Bluetooth Smart) launched by Apple at WWDC in

AdvancedProtipOver 1 day390
Bluetooth iBeacon

Things used in this project

Hardware components

waterproof beacon
×1

Software apps and online services

bluetooth beacon

Story

Read more

Code

example 1

C/C++
Start with a brief example:
@implementation ViewController
{
CBPeripheralManager *_peripheralManager;
BOOL _isAdvertising;
}

- (void)_startAdvertising
{
NSUUID *estimoteUUID = [[NSUUID alloc] initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"];

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID
major:2
minor:1
identifier:@"SimEstimote"];
NSDictionary *beaconPeripheralData = [region peripheralDataWithMeasuredPower:nil];

[_peripheralManager startAdvertising:beaconPeripheralData];
}

- (void)_updateEmitterForDesiredState
{
if (_peripheralManager.state == CBPeripheralManagerStatePoweredOn)
{
// only issue commands when powered on

if (_isAdvertising)
{
if (!_peripheralManager.isAdvertising)
{
[self _startAdvertising];
}
}
else
{
if (_peripheralManager.isAdvertising)
{
[_peripheralManager stopAdvertising];
}
}
}
}

#pragma mark - CBPeripheralManagerDelegate

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
[self _updateEmitterForDesiredState];
}

#pragma mark - Actions

- (IBAction)advertisingSwitch:(UISwitch *)sender
{
_isAdvertising = sender.isOn;

[self _updateEmitterForDesiredState];
}

@end

example 2

C/C++
@implementation AppDelegate
{
CLLocationManager *_locationManager;
BOOL _isInsideRegion; // flag to prevent duplicate sending of notification
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)options
{
// create a location manager
_locationManager = [[CLLocationManager alloc] init];

// set delegate, not the angle brackets
_locationManager.delegate = self;

NSUUID *estimoteUUID = [[NSUUID alloc] initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"];
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID
identifier:@"Estimote Range"];

// launch app when display is turned on and inside region
region.notifyEntryStateOnDisplay = YES;
// isMonitoringAvailableForClass:Returns      a Boolean indicating whether the device supports region monitoring using      the specified class.
if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]])
{
[_locationManager startMonitoringForRegion:region];

// get status update right away for UI
[_locationManager requestStateForRegion:region];
}
else
{
NSLog(@"This device does not support monitoring beacon regions");
}

// Override point for customization after application launch.
return YES;
}

- (void)_sendEnterLocalNotification
{
if (!_isInsideRegion)
{
UILocalNotification *notice = [[UILocalNotification alloc] init];

notice.alertBody = @"Inside Estimote beacon region!";
notice.alertAction = @"Open";

[[UIApplication sharedApplication] scheduleLocalNotification:notice];
}

_isInsideRegion = YES;
}

- (void)_sendExitLocalNotification
{
if (_isInsideRegion)
{
UILocalNotification *notice = [[UILocalNotification alloc] init];

notice.alertBody = @"Left Estimote beacon region!";
notice.alertAction = @"Open";

[[UIApplication sharedApplication] scheduleLocalNotification:notice];
}

_isInsideRegion = NO;
}

- (void)_updateUIForState:(CLRegionState)state
{
ViewController *vc = (ViewController *)self.window.rootViewController;

if (state == CLRegionStateInside)
{
vc.label.text = @"Inside";
}
else if (state == CLRegionStateOutside)
{
vc.label.text = @"Outside";
}
else
{
vc.label.text = @"Unknown";
}
}

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager
didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
// always update UI
[self _updateUIForState:state];

if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
{
// don't send any notifications
return;
}

if (state == CLRegionStateInside)
{
[self _sendEnterLocalNotification];
}
else
{
[self _sendExitLocalNotification];
}
}

@end

Credits

Eileen Wen
3 projects • 0 followers
Contact
Thanks to .

Comments

Please log in or sign up to comment.