2013-10-14 8 views
15

私は、アプリケーションがiOS iBeaconと周辺サービスを同時に広告する必要があるiOS用アプリケーションを作成しています。 iBeaconとの近接性のためにiOSによって目覚めた後(ただしバックグラウンドのままでも)、ユースケースが中央(BLE用語で)周辺機器に接続する必要があるため、サービスは周辺機器で簡単に検出可能であることが宣伝されている必要があります。セントラルでバックグラウンドで実行されているアプリは、すべての周辺機器を検出するのではなく、利用可能なサービスで周辺機器を検出できます。私のコードは、サービスまたはiBeaconのいずれかを宣伝するために働いていますが、私は同時に両方を行う方法を理解していません。 iBeaconは38bytesの空き領域のうち21bytesを使用する可能性があり、ビーコンだけでなくサービスも宣伝するためのスペースが不足している可能性があります。iOS CoreBluetooth/iBeacon:iBeaconと周辺サービスを同時にアドバタイズする

self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
    major:1 
    minor:1 
    identifier:@"bentboolean"]; 
NSMutableDictionary *dict = [[self.beaconRegion peripheralDataWithMeasuredPower:nil] mutableCopy];  
[self.peripheralManager startAdvertising:dict ]; 

この作品(サービス):

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setValue:@[serviceUUID] forKey:CBAdvertisementDataServiceUUIDsKey]; 
[self.peripheralManager startAdvertising:dict ]; 

は動作しません同時に両方のサービスを宣伝しようとすると、2つの追加

は、これは(ビーコン)動作します。サービスではなく、ビーコンのみを宣伝します。

self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
    major:1 
    minor:1 
    identifier:@"bentboolean"]; 
NSMutableDictionary *dict = [[self.beaconRegion peripheralDataWithMeasuredPower:nil] mutableCopy]; 
[dict setValue:@[serviceUUID] forKey:CBAdvertisementDataServiceUUIDsKey]; 
[self.peripheralManager startAdvertising:dict ]; 

ありがとうございました!

+0

こんにちは、これを修正しましたか?私はそれがBluetoothの能力のために可能だったとは思わなかった... – CW0007007

答えて

-1

私は、これは別途レシーバとビーコンの両方に別々のCLLocationManagerとCLBeaconRegionで軌道に乗ることができました:

#import "GRBothViewController.h" 

@interface GRBothViewController() 

@end 

@implementation GRBothViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 

    self.locationScanner = [[CLLocationManager alloc] init]; 
    self.locationScanner.delegate = self; 

    [self initBeacon]; 
    [self initRegion]; 
    [self locationManager:self.locationManager didStartMonitoringForRegion:self.scannerRegion]; 
} 

- (void)initBeacon { 
    NSLog(@"Starting beacon"); 

    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString: @"23542266-18D1-4FE4-B4A1-23F8195B9D39"]; 
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
                   major:1 
                   minor:1 
                  identifier:@"com.thisisgrow.Grow"]; 
    [self transmitBeacon:self]; 
} 

- (IBAction)transmitBeacon:(id)sender { 
    self.beaconPeripheralData = [self.beaconRegion peripheralDataWithMeasuredPower:nil]; 
    self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self 
                    queue:nil 
                    options:nil]; 
} 

-(void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { 
    if (peripheral.state == CBPeripheralManagerStatePoweredOn) { 
     NSLog(@"Powered On"); 
     [self.peripheralManager startAdvertising:self.beaconPeripheralData]; 
    } else if (peripheral.state == CBPeripheralManagerStatePoweredOff) { 
     NSLog(@"Powered Off"); 
     [self.peripheralManager stopAdvertising]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; 
} 

- (void)initRegion { 
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"23542266-18D1-4FE4-B4A1-23F8195B9D39"]; 
    _scannerRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.thisisgrow.Grow"]; 
    _scannerRegion.notifyEntryStateOnDisplay = YES; 
    [_locationScanner startMonitoringForRegion:self.scannerRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
    //SCANNER 
    [self.locationScanner startRangingBeaconsInRegion:self.scannerRegion]; 
} 

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    //SCANNER HAS LEFT THE AREA 
    [self.locationScanner stopRangingBeaconsInRegion:self.scannerRegion]; 
} 

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { 
    CLBeacon *beacon = [[CLBeacon alloc] init]; 
    NSLog(@"Beacons: %d", [beacons count]); 
    if(beacons && [beacons count]>0){ 
     beacon = [beacons firstObject]; 
    } 
    else{ 

    } 
} 

ここでの唯一の制限は、デバイス自体を検出できないということです。

+0

私が見た他の興味深い観測:*別の*アプリがiBeaconとして広告しても、あなたのアプリはそれを検出できません。さらに、外部のiBeaconが同じ識別子を宣伝している場合でも、アプリはそれを検出できません。言い換えれば、iBeacon IDセットの広告は、同じIDセットの検出をブロックします。 – davidgyoung

+0

しかし、デバイスをiBeaconとして使用すると、この目的のためにデバイスを使用する場合は、デバイスの一意のUUIDを(必要に応じて起動時でも)自動生成するだけで十分です。 ほとんどの制限要因は、1)iBeaconとして使用されるデバイスは、バックグラウンドAT ALLでブロードキャストされないこと、2)アプリケーションは、onEnterで起床した場合を除いて、バックグラウンドで個々のiBeaconの範囲を限定することができないという事実UUID地域に出入りするときにのみ発火するイベントを残します。 – d2burke

+0

@ d2burke iBeaconとして使用されるデバイスは、バックグラウンドではまったくブロードキャストされません。このアプリがBluetooth周辺機器のバックグラウンドモードを使用している場合でも、これが当てはまるかどうかは分かりますか? – darrinm

0

私の練習では、iBeacon & BLEサービスは同時に広告することができません。

BLEサービスは、iBeaconと混在した広告をフォアグラウンドでアドバタイズできません。 iBeaconはバックグラウンドで広告することはできません。

iBeacon & BLEサービスは、1つずつ広告を出すことができます。 iBeaconは0.5秒をアドバタイズし、次に BLEサービスは30.0秒をアドバタイズします。

希望するこれは役に立ちます

関連する問題