문제 설명
Objective‑C에서 startMonitoringForRegion을 사용하여 여러 지역을 스캔하는 방법 (How to scan multiple regions using startMonitoringForRegion in Objective‑C)
두 개의 튜토리얼을 통해 기본 C에 대해 읽고 있습니다. 지난 주 정도 수행을 통해 가장 잘 배우고 몇 가지 가벼운 앱을 작성했습니다. ibeacon을 사용할 몇 가지 앱을 작성하는 데 속도를 내고 있습니다. 몇 가지 샘플을 살펴보고 참조 가이드를 읽으면서 각 UUID에 대해 startMonitoringForRegion을 실행하여 여러 영역을 스캔할 수 있음을 알 수 있습니다. 좋아, 그래서 각 UUID에 대해 실행할 수 있다고 생각하지만 작동하지 않습니다. 기본적으로 완전히 잘못된 작업을 수행하고 있다고 확신합니다. 아래 코드는 완전히 해킹된 것입니다. 일단 의미 체계를 파악하면 API 호출로 DB에서 UUID를 가져온 다음 루프를 통해 모니터링을 활성화합니다. 아래 코드는 4개의 UUID 중 2개만 표시하는 마지막 루프를 생성합니다.
헤더:
@property (strong, nonatomic) CLBeaconRegion *myBeaconRegion;
@property (strong, nonatomic) CLBeaconRegion *myBeaconRegion2;
@property (strong, nonatomic) CLBeaconRegion *myBeaconRegion3;
@property (strong, nonatomic) CLBeaconRegion *myBeaconRegion4;
메인:
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"86E4BDEA‑C6FF‑442C‑95CB‑E6E557A23CF2"];
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.appcoda.testregion"];
NSUUID *uuid2 = [[NSUUID alloc] initWithUUIDString:@"C9AFF296‑A722‑4F2D‑8669‑47B7CCC79A14"];
self.myBeaconRegion2 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid2 identifier:@"com.appcoda.testregion"];
NSUUID *uuid3 = [[NSUUID alloc] initWithUUIDString:@"1DBDDC7C‑49BB‑48BF‑A2F6‑A4825BD514EA"];
self.myBeaconRegion3 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid3 identifier:@"com.appcoda.testregion"];
NSUUID *uuid4 = [[NSUUID alloc] initWithUUIDString:@"8D942B9E‑0197‑4C81‑8722‑92144599E9F7"];
self.myBeaconRegion4 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid4 identifier:@"com.appcoda.testregion"];
[self.locationManager startMonitoringForRegion:self.myBeaconRegion];
[self.locationManager startMonitoringForRegion:self.myBeaconRegion2];
[self.locationManager startMonitoringForRegion:self.myBeaconRegion3];
[self.locationManager startMonitoringForRegion:self.myBeaconRegion4];
NSSet *setOfRegions = [self.locationManager monitoredRegions];
for (CLRegion *region in setOfRegions) {
NSLog (@"region info: %@", region);
}
참조 솔루션
방법 1:
I think the problem is your region identifiers. Each beacon region identifier
must be unique, otherwise CLLocationManager
treats them as the same region.
Try setting a unique identifier for each region:
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"86E4BDEA‑C6FF‑442C‑95CB‑E6E557A23CF2"];
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.appcoda.testregion"];
NSUUID *uuid2 = [[NSUUID alloc] initWithUUIDString:@"C9AFF296‑A722‑4F2D‑8669‑47B7CCC79A14"];
self.myBeaconRegion2 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid2 identifier:@"com.appcoda.testregion2"];
NSUUID *uuid3 = [[NSUUID alloc] initWithUUIDString:@"1DBDDC7C‑49BB‑48BF‑A2F6‑A4825BD514EA"];
self.myBeaconRegion3 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid3 identifier:@"com.appcoda.testregion3"];
NSUUID *uuid4 = [[NSUUID alloc] initWithUUIDString:@"8D942B9E‑0197‑4C81‑8722‑92144599E9F7"];
self.myBeaconRegion4 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid4 identifier:@"com.appcoda.testregion4"];
You should see each region listed from your NSLog
statement. No need for dispatch_async
, either.
방법 2:
The header file for startMonitoringForRegion states "This is done asynchronously and may not be immediately reflected in monitoredRegions".
You can verify this by adding a time delay to your for loop:
double delayInSeconds = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSSet *setOfRegions = [self.locationManager monitoredRegions];
for (CLRegion *region in setOfRegions) {
NSLog (@"region info: %@", region);
}
});
방법 3:
If you need to use multiple beacons to be monitored then you can able to differentiate using the beacon Major and Minor values. Read the tutorial here to understand about the ibeacons better.
‑(void)setBeaconTranmitter:(NSInteger)major minorValue:(NSInteger)minor {
// We need to set beacon regions here.
NSUUID * uid = [[NSUUID alloc] initWithUUIDString:uuid]; //uuid value is static common string for all beacons.
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uid major:major minor:minor identifier:beaconsId];//beaconsId is a common identifier for all beacons.
// Call your Transmitter function here
[self configureTransmitter];
}
Above way I have configured three beacons regions with major and minor value difference. I placed three buttons and called IBAction to send different Major and Minor values using tags and calling function. I installed the same app in three different iphones and enabled each different button in each phones and installed a receiver in another phone for demo. Worked like charm! but it takes time to detect region while moving from one region to another.
(by user3196820、James Frost、kenshin03、Vijay)