developer tip

iOS9의 CLLocationManager에있는 allowsBackgroundLocationUpdates

optionbox 2020. 11. 23. 08:02
반응형

iOS9의 CLLocationManager에있는 allowsBackgroundLocationUpdates


CoreLocationXcode7 (사전 출시됨)의 앱에서 프레임 워크를 사용 하고 allowsBackgroundLocationUpdates있으며 CLLocationManager클래스에 새로 추가 된 속성이 있음을 알았습니다 .

기능 탭의 백그라운드 모드에서이 속성과 위치 업데이트 간의 관계는 무엇입니까? 기본값은 무엇이며 iOS9에서 실행되는 앱에 영향을 줍니까?


이 새로운 속성은 WWDC 세션 "핵심 위치의 새로운 기능"에 설명되어 있습니다.

기본값은 NOiOS 9에 링크하는 경우입니다.

앱 (파란색 상태 표시 줄을 표시하지 않고) 백그라운드에서 위치를 사용하는 경우, 당신은 설정해야합니다 allowsBackgroundLocationUpdatesYES의 Info.plist에서 백그라운드 모드 기능을 설정뿐만 아니라. 그렇지 않으면 위치 업데이트가 포 그라운드로만 전달됩니다. 장점은 이제 동일한 앱에서 백그라운드 위치 업데이트가있는 위치 관리자와 전경 위치 업데이트 만있는 다른 위치 관리자를 가질 수 있다는 것 입니다. 값을 NO재설정 하여 동작을 변경할 수도 있습니다.

문서는 그것에 대해 매우 명확합니다.

기본적으로 이는 최소 배포 대상에 관계없이 iOS 9.0 이상에 연결된 애플리케이션의 경우 아니요입니다.

Info.plist에 "위치"를 포함하도록 UIBackgroundModes를 설정 한 경우 백그라운드에서 계속할 의도로 -startUpdatingLocation을 호출 할 때마다 런타임에이 속성을 YES로 설정해야합니다.

UIBackgroundModes에 "위치"가 포함되지 않은 경우이 속성을 YES로 설정하면 치명적인 오류가 발생합니다.

이 속성을 NO로 재설정하는 것은 UIBackgroundModes 값에서 "위치"를 생략하는 것과 같습니다. 애플리케이션이 실행 중일 때 (즉, 일시 중지되지 않은 경우), 충분한 권한이있을 때마다 위치에 대한 액세스가 계속 허용됩니다 (예 : WhenInUse 권한이 있고 사용 중이거나 항상 권한이 있음). 그러나 앱에는 여전히 일반적인 작업 일시 중단 규칙이 적용됩니다.

가능한 권한 부여 값에 대한 자세한 내용은 -requestWhenInUseAuthorization 및 -requestAlwaysAuthorization을 참조하세요.


Xcode7 (사전 출시됨)의 앱에서 CoreLocation 프레임 워크를 사용하고 있고 CLLocationManager 클래스에 allowsBackgroundLocationUpdates라는 새로 추가 된 속성이 있음을 알 수 있습니다.

이 새로운 속성은 WWDC 세션 "핵심 위치의 새로운 기능"에 설명되어 있습니다.여기에 이미지 설명 입력

기본값은 NOiOS 9에 링크하는 경우입니다.

앱 (파란색 상태 표시 줄을 표시하지 않고) 백그라운드에서 위치를 사용하는 경우, 당신은 설정해야합니다 allowsBackgroundLocationUpdatesYES의 Info.plist에서 백그라운드 모드 기능을 설정뿐만 아니라. 그렇지 않으면 위치 업데이트가 포 그라운드로만 전달됩니다. 장점은 이제 동일한 앱에서 백그라운드 위치 업데이트가있는 위치 관리자와 전경 위치 업데이트 만있는 다른 위치 관리자를 가질 수 있다는 것입니다. 값을 NO재설정 하여 동작을 변경할 수도 있습니다.

문서는 그것에 대해 매우 명확합니다.

기본적으로 이는 최소 배포 대상에 관계없이 iOS 9.0 이상에 연결된 애플리케이션의 경우 아니요입니다.

Info.plist에 "위치"를 포함하도록 UIBackgroundModes를 설정 한 경우 백그라운드에서 계속할 의도로 -startUpdatingLocation을 호출 할 때마다 런타임에이 속성을 YES로 설정해야합니다.

UIBackgroundModes에 "위치"가 포함되지 않은 경우이 속성을 YES로 설정하면 치명적인 오류가 발생합니다.

이 속성을 NO로 재설정하는 것은 UIBackgroundModes 값에서 "위치"를 생략하는 것과 같습니다. 애플리케이션이 실행 중일 때 (즉, 일시 중지되지 않은 경우), 충분한 권한이있을 때마다 위치에 대한 액세스가 계속 허용됩니다 (예 : WhenInUse 권한이 있고 사용 중이거나 항상 권한이 있음). 그러나 앱에는 여전히 일반적인 작업 일시 중단 규칙이 적용됩니다.

가능한 권한 부여 값에 대한 자세한 내용은 -requestWhenInUseAuthorization 및 -requestAlwaysAuthorization을 참조하세요.

Info.plist를 다음과 같이 설정합니다. 여기에 이미지 설명 입력

Info.plist 구성의 구문은 다음과 같습니다.

<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

또는 앱 타겟의 기능 탭을 엽니 다.

여기에 이미지 설명 입력
(출처 : raywenderlich.com )

다음과 같이 사용하십시오.

_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
    [_locationManager requestAlwaysAuthorization];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];

여기 에 데모를 작성합니다 (Demo2).


글쎄, 나는 7 베타가 항상 시뮬레이터와 충돌하기 때문에 여전히 xCode 6을 사용하고 있으며 iOS9에 대한 링크조차 없지만이 문제가 있습니다! 이 속성은 iOS8에 존재하지 않기 때문에 설정할 수 없습니다! 오 애플, 언제 고통이 끝날까요?!

이 늦은 바인딩 호출을 수행하여이 xCode6 호환 버전으로 변경했습니다.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {

            BOOL yes = YES;

            NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )];
            NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
            [invocation setTarget: locationManager];
            [invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ];
            [invocation setArgument: &yes atIndex: 2];
            [invocation invoke];
        }

iOS8 (아무것도하지 않음) 및 iOS9 베타 6 (메소드를 올바르게 호출 함)에서 작동하는지 확인했습니다.


iOS 9.0.x의 백그라운드 모드에서 동일한 위치 서비스에 직면했으며 아래 코드를 추가하여이 게시물에서 권장하는대로 수정했습니다.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

그러나 그것은 iOS 9.1에서 작동하지 않습니다 누구든지 같은 문제가 있습니까 ??? 그렇다면 친절하게 도와주세요. 감사


{
NSArray* backgroundModes  = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"];

     if(backgroundModes && [backgroundModes containsObject:@"location"]) {
         if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
             // We now have iOS9 and the right capabilities to set this:
             [manager setAllowsBackgroundLocationUpdates:YES];
         }
     }
}

다음 은 iOS 8에서 iOS 9로 업데이트 된 다양한 방법에 대한 요약입니다.

사용중인 각 프레임 워크에 대해 많은 API 및 코드를 검색해야합니다. 따라서 일반 프레임 워크에서 검색 한 다음 이러한 방법을 찾아 감가 상각 된 방법을 업데이트합니다.

참고 URL : https://stackoverflow.com/questions/30808192/allowsbackgroundlocationupdates-in-cllocationmanager-in-ios9

반응형