iOS

iOS ile iBeacon deneyimlerim

Merhaba, Bu yazıda sizlere beacon teknolojisiyle yazılım geliştirebilme hakkında yaşadığım tecrübeleri aktarmaya çalışacağım. Malum, günümüzde tüm kaynakların ingilizce olduğu bir ortamda Türkçe kaynak, deneyim vb. paylaşımının özellikle biz geli...

Omer |

14.11.2016

Merhaba,

Bu yazıda sizlere beacon teknolojisiyle yazılım geliştirebilme hakkında yaşadığım tecrübeleri aktarmaya çalışacağım. Malum, günümüzde tüm kaynakların ingilizce olduğu bir ortamda Türkçe kaynak, deneyim vb. paylaşımının özellikle biz geliştiriciler adına çok kıymetli olduğuna inanıyorum.

İlk yazım olduğu için, şimdiden yapacağım her türlü (imla, yazım yanlışı vb.) hatadan dolayı özür dilerim.

Beacon veya iBeacon aynı anlama gelen kavramlardır. Aslında teknolojinin adı Beacon fakat günümüzde Apple teknolojilerinin yaygın ve popüler kullanımından dolayı iBeacon kavramı Beacon kavramının önüne geçti. Peki tam olarak nedir bu Beacon? Basitçe şöyle tanımlamaya çalışayım; Belirli bir alanda konumlandırılmış Beacon cihazlarını akıllı telefonlarınız ile dinleyerek, bu Beacon cihazlarından gelen sinyallere göre akıllı telefonlarınız üzerinde tepkiler alabiliyorsunuz. Cihazlar bu iletişimi Bluetooth Low Energy(BLE) teknolojisini kullanarak sağlıyorlar.

Örnek vermek gerekirse; içinde farklı reyonlar barındıran bir mağaza düşünün ve bu reyonların her birinde Beacon cihazları konumlandırılmış olsun. Siz mağaza içinde farklı reyonlarda gezerken bulunduğunuz reyondaki (konumdaki) Beacon cihazı ile akıllı telefonunuz etkileşime geçip size o reyona (konuma) özel bir bildirim, kampanya, bilgilendirme vb. yapabiliyor.

 

 

 

 

Şimdi yazılım tarafında, Beacon teknolojisini iOS ile nasıl geliştirebiliriz onu örneklemeye çalışacağım.

1) #import <CoreBluetooth/CoreBluetooth.h> kütüphanesi import edilmelidir.


2) CLLocationManagerDelegate ve CBCentralManagerDelegate delegate’ lerini class’ ımıza bağlamalıyız.


3) Beacon entegrasyonu için olmazsa olmazımız, akıllı telefonumuzun bluetooth özelliğinin açık olmasıdır. Bunu kontrol edebilmek için şöyle bir metod yazmalıyız;

- (void)detectBluetooth {
    if(!self.bluetoothManager) {
        // Put on main queue so we can call UIAlertView from delegate callbacks.
        self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
    }
    [self centralManagerDidUpdateState:self.bluetoothManager];
}

4) centralManagerDidUpdateState delegate metodu içinde Region initialize metodunu call etmeliyiz.

#pragma mark - CBCentralManager delegate
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    switch(self.bluetoothManager.state) {
        case CBCentralManagerStateResetting:
            isBleActive = NO;
            break;
        case CBCentralManagerStateUnsupported:
            isBleActive = NO;
            break;
        case CBCentralManagerStateUnauthorized:
            isBleActive = NO;
            break;
        case CBCentralManagerStatePoweredOff:
            isBleActive = NO;
            break;
        case CBCentralManagerStatePoweredOn:
            isBleActive = YES;
            [self initRegion];
            break;
        default:
            isBleActive = NO;
            break;
    }
}

5) initRegion helper metod

- (void)initRegion {
    int i = 0;
    deviceMinorValues = [NSArray arrayWithObjects:[NSNumber numberWithInt:1111],[NSNumber numberWithInt:1212],[NSNumber numberWithInt:1313], nil];
    deviceIdentifiers = [NSArray arrayWithObjects:@"a bolge",@"b bolge",@"c bolge", nil];
    // setup location manager
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization];
    }
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"XXXXXX-XXXXX"];
    for (NSNumber *minorValue in deviceMinorValues) {
        myBeaconRegion  = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:1 minor:[minorValue intValue] identifier:deviceIdentifiers[i]];
        myBeaconRegion.notifyOnEntry = YES;
        myBeaconRegion.notifyOnExit = YES;
        myBeaconRegion.notifyEntryStateOnDisplay = YES;
        self.locationManager.pausesLocationUpdatesAutomatically = NO;
        [self.locationManager startUpdatingLocation];
        [self.locationManager startMonitoringForRegion:myBeaconRegion];
        i++;
    }
    if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }
}

6) Kullanıcının hangi region state’i içinde olduğunu bulmak için requestStateForRegion call etmek gerekir.

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    [manager requestStateForRegion:region];
}

7) Kullanıcının region state’i belirlenir.

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    if ([region isKindOfClass:[CLBeaconRegion class]] && state == CLRegionStateInside) {
        CLBeaconRegion *beaconRegion = (CLBeaconRegion *) region;
        NSLog(@"CLRegionStateInside: Minor %@, Identifier %@",beaconRegion.minor,beaconRegion.identifier);
        [self locationManager:manager didEnterRegion:beaconRegion];
    }
    else if ([region isKindOfClass:[CLBeaconRegion class]] && state == CLRegionStateOutside) {
        NSLog(@"--CLRegionStateOutside");
        [self locationManager:manager didExitRegion:region];
    }
    else if ([region isKindOfClass:[CLBeaconRegion class]] && state == CLRegionStateUnknown) {
        NSLog(@"--CLRegionStateUnknown");
    }
}

8) didEnterRegion delegate metodu body kısmı yazılır. Burada geliştireceğiniz özelliklere göre kullanıcıya local notification ile bildirimde bulunabilirsiniz vb.

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    if (region.identifier.length != 0) {
        CLBeaconRegion *beaconRegion = (CLBeaconRegion *) region;
        NSLog(@"didEnterRegion: Minor %@, Identifier %@",beaconRegion.minor,beaconRegion.identifier);
    }
}

9) didExitRegion delegate metodu body kısmı yazılır. Burada geliştireceğiniz özelliklere göre kullanıcıya local notification ile bildirimde bulunabilirsiniz vb.

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    if (region.identifier.length != 0) {
        CLBeaconRegion *beaconRegion = (CLBeaconRegion *) region;
        NSLog(@"didExitRegion: Minor %@, Identifier %@",beaconRegion.minor,beaconRegion.identifier);
    }
}

10) didRangeBeacons delegate metodu içinde sinyal yayan Beacon cihazlarını minor değerlerine göre ayırt edebilir ve akıllı telefonunuz ile arasında bulunan mesafeyi görebilir ve dilerseniz bu mesafeye göre didEnterRegion, didExitRegion metodları içinde örnek olarak söylediğim local notification ile kullanıcıyı bilgilendirmeyi Beacon’a olan mesafeye göre yapmayı sağlayabilirsiniz.

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    CLBeacon *foundBeacon = [beacons firstObject]; //En yakın beacon array'in basında bulunur.
    NSLog(@"Minor: %@",foundBeacon.minor);
    NSLog(@"Accuracy: %f",foundBeacon.accuracy);
    NSLog(@"---------------------------");
}

Şimdilik iBeacon özelinde paylaşabileceğim deneyimlerim bu şekilde. Umarım bir faydası olmuştur.

Görüşmek üzere.

Omer |

14.11.2016

Yorumlar

Geleceği Yazanlar Kullanıcısı
22.12.2019 - 08:37

Sohbet Odaları ve Siteleri

Yener
07.01.2019 - 11:38

Kaynak dosyayı paylaşma imkanınız var mı.
 

Ali Öktem
08.09.2017 - 01:04

Güzel acıklayıcı bir makale olmuş ömer hocam