2013-12-10 2 views
1

비컨으로 테스트하는 동안 (ios 디바이스) 리스너 비컨이 예기치 않은 동작을하는 것을 발견했습니다. locationManager : 비콘이 영역에 들어갔더라도 didEnterRegion 메소드가 호출되지 않습니다. 하지만 locationManager : didRangeBeacons : inRegion :이 올바르게 호출되고 감지 된 비콘이 여기에 표시됩니다.locationManager : didEnterRegion과 didExitRegion이 호출되지 않습니다. iBeacon

- (void)startListening{ 

self.locationManager = [[CLLocationManager alloc] init]; 
[self.locationManager setDelegate:self]; 
NSUUID *myProximityUUID = [[NSUUID alloc] 
          initWithUUIDString:IDENTIFIER]; 
_beaconRegion = [[CLBeaconRegion alloc] 
       initWithProximityUUID:myProximityUUID 
       identifier:kPFTransmitterIdentifier]; 
_beaconRegion.notifyEntryStateOnDisplay = YES; 
_beaconRegion.notifyOnEntry =YES; 
[self.locationManager startMonitoringForRegion:self.beaconRegion]; 

[self.locationManager requestStateForRegion:self.beaconRegion]; 
//[self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; 

}

이 내가 작성한 코드입니다.

앱이 실행되지 않아도 리스너 앱이 특정 지역으로 들어갈 때 로컬 알림을 만들어야합니다.

답변

0

info.plist 파일에서 백그라운드 위치 업데이트를 위해 앱을 등록하셨습니까? See reference

+0

예 .. 이미 해냈습니다 –

+0

확실한 사실은 '신호가 지역에 들어오는 경우'라고 적었습니다. 일을 분명히하기 위해서 : 신호의 영역에 들어가면, 그 방법이 호출되면서, 다른 방법으로는 호출되지 않습니다. 이 상황을 가정 할 때 나는 맞습니까? – Martijn

+0

iBeacon 모니터링을 수행하기 위해 'UIBackgroundModes'에이 위치 값을 설정할 필요가 없습니다. 이 값은 백그라운드에서 실행중인 탐색 앱이 위치 업데이트를 수신하기위한 것입니다. – tedyyu

1

여기 내가 사용하는 것이 문제 해결 절차입니다 :

  1. 첫째는 포 그라운드에서 작업을 진행하면 배열 UIBackgroundModes에 행을 추가하고 항목 location를 추가해야합니다. 포 그라운드에서 앱을 실행하고 iBeacon을 끕니다 (스위치가없는 경우 배터리를 꺼내거나 200 피트 떨어진 곳에 두십시오). 10 초 정도 기다리십시오 (이 시간에는 지역 알림이 없어야 함) iBeacon을 다시 켜고 지역 알림을 받았는지 확인하십시오. 하나도 얻지 못한다면 콜백 정의에 문제가 있다고 생각됩니다. 이 경우 해당 코드를 게시하십시오.

  2. 포어 그라운드에서 작업 한 후에는 어깨 단추로 백그라운드에서 작업하도록하십시오. 백그라운드에서이 작업을 수행하는 데 오랜 시간이 걸리므로 전경 (위의 절차 사용) 중에는 지역에없는 알려진 상태로 전화를 가져 오십시오. 지역 밖으로 나가는 것을 알게되면 화면을 끄고 앱을 백그라운드에 놓습니다. 그런 다음 iBeacon을 다시 켜십시오. _beaconRegion.notifyOnEntry = YES를 사용하므로 어깨 또는 홈 버튼을 눌러 화면을 강제로 밀 때 1 초 이내에 콜백을 받아야합니다.

  3. 일단이 작업을 수행하면 전화기가 어깨 버튼을 누르지 않고 백그라운드에서 존재를 감지하도록 할 수 있습니다. 이해하면 예상보다 오래 걸릴 수 있습니다. 자세한 내용은 this discussion을 참조하십시오.

0

가끔 내도 당신이 notifyEntryStateOnDisplay 또는 .IT 도움이 될 notifyOnEntry 조건없이 한 번 테스트 할 수 있습니다 내 device.Probably에이 조건을 테스트 한 모니터링하기 전에 notifyEntryStateOnDisplay를 사용하는 경우 메소드가 호출되는되지 않은 didEnterRegion.

0

코드에 아무런 문제가 없을 수 있습니다. 나는 탐지기가 이미 비콘 영역 (그 옆)에있을 때 테스트 비컨을 켜면 비콘 영역에 들어갔다는 통보를받지 못한다는 것을 알았다. iOS가 경계 교차점을 감지하지 못했기 때문에 그럴 가능성이 큽니다. iOS는 "out of region"과 "inside region"(어느 방향 으로든) 사이의 경계를 넘었을 때이를 알리고 적절한 델리게이트 메소드를 호출 할 때만 통지합니다. 이것을 테스트하려면 비콘을 켜기 만하면되지만 탐지기는 꺼져 있습니다. 위의 davidgyoung에 표시된 바와 같이, 당신의 등대에서 200 피트 떨어진 곳에서 걸어 라. 그런 다음 탐지기를 켜고 표지쪽으로 걸어갑니다. 지역을 입력 할 때 "didEnterBeaconRegion"알림을 받아야합니다. 시도 할 수있는 또 다른 방법은 정의 된 모니터링 영역의 상태가 변경 될 때마다 호출되는 "locationManagerDidDetermineStateForRegion"대리자 메서드를 구현하는 것입니다.이 메서드는 감지기를 켤 때마다 발생합니다. 그렇게 할 경우 탐지기가 시작될 때 이미 탐지 영역 내에있는 경우에도 콜백을 받아야합니다. 하지만 백그라운드에서 발생하지 않으므로 다른 콜백도 필요합니다.

+0

지역에있을 때 locationManagerDidDetermineStateForRegion 대리자가 계속 호출됩니다. 그러나 신호 (주요 번호와 부 번호)를 식별 할 수있는 방법이 있습니다. 이 함수에 전달되는 매개 변수는 state 및 region입니다. 지역에서 주요 번호와 부 번호에 액세스하려고하면 항상 null입니다. 지역 매개 변수에서 uuid 만 표시됩니다. –

관련 문제