iOS9의 CLLocationManager에있는 allowsBackgroundLocationUpdates
CoreLocation
Xcode7 (사전 출시됨)의 앱에서 프레임 워크를 사용 하고 allowsBackgroundLocationUpdates
있으며 CLLocationManager
클래스에 새로 추가 된 속성이 있음을 알았습니다 .
기능 탭의 백그라운드 모드에서이 속성과 위치 업데이트 간의 관계는 무엇입니까? 기본값은 무엇이며 iOS9에서 실행되는 앱에 영향을 줍니까?
이 새로운 속성은 WWDC 세션 "핵심 위치의 새로운 기능"에 설명되어 있습니다.
기본값은 NO
iOS 9에 링크하는 경우입니다.
앱 (파란색 상태 표시 줄을 표시하지 않고) 백그라운드에서 위치를 사용하는 경우, 당신은 설정해야합니다 allowsBackgroundLocationUpdates
에 YES
의 Info.plist에서 백그라운드 모드 기능을 설정뿐만 아니라. 그렇지 않으면 위치 업데이트가 포 그라운드로만 전달됩니다. 장점은 이제 동일한 앱에서 백그라운드 위치 업데이트가있는 위치 관리자와 전경 위치 업데이트 만있는 다른 위치 관리자를 가질 수 있다는 것 입니다. 값을 NO
로 재설정 하여 동작을 변경할 수도 있습니다.
문서는 그것에 대해 매우 명확합니다.
기본적으로 이는 최소 배포 대상에 관계없이 iOS 9.0 이상에 연결된 애플리케이션의 경우 아니요입니다.
Info.plist에 "위치"를 포함하도록 UIBackgroundModes를 설정 한 경우 백그라운드에서 계속할 의도로 -startUpdatingLocation을 호출 할 때마다 런타임에이 속성을 YES로 설정해야합니다.
UIBackgroundModes에 "위치"가 포함되지 않은 경우이 속성을 YES로 설정하면 치명적인 오류가 발생합니다.
이 속성을 NO로 재설정하는 것은 UIBackgroundModes 값에서 "위치"를 생략하는 것과 같습니다. 애플리케이션이 실행 중일 때 (즉, 일시 중지되지 않은 경우), 충분한 권한이있을 때마다 위치에 대한 액세스가 계속 허용됩니다 (예 : WhenInUse 권한이 있고 사용 중이거나 항상 권한이 있음). 그러나 앱에는 여전히 일반적인 작업 일시 중단 규칙이 적용됩니다.
가능한 권한 부여 값에 대한 자세한 내용은 -requestWhenInUseAuthorization 및 -requestAlwaysAuthorization을 참조하세요.
Xcode7 (사전 출시됨)의 앱에서 CoreLocation 프레임 워크를 사용하고 있고 CLLocationManager 클래스에 allowsBackgroundLocationUpdates라는 새로 추가 된 속성이 있음을 알 수 있습니다.
이 새로운 속성은 WWDC 세션 "핵심 위치의 새로운 기능"에 설명되어 있습니다.
기본값은 NO
iOS 9에 링크하는 경우입니다.
앱 (파란색 상태 표시 줄을 표시하지 않고) 백그라운드에서 위치를 사용하는 경우, 당신은 설정해야합니다 allowsBackgroundLocationUpdates
에 YES
의 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];
글쎄, 나는 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 및 코드를 검색해야합니다. 따라서 일반 프레임 워크에서 검색 한 다음 이러한 방법을 찾아 감가 상각 된 방법을 업데이트합니다.
'developer tip' 카테고리의 다른 글
일치하는 와일드 카드는 엄격하지만 'context : component-scan'요소에 대한 선언을 찾을 수 없습니다. (0) | 2020.11.23 |
---|---|
jQuery를 사용하여 particuler 링크를 클릭하면 부트 스트랩 탐색 탭의 특정 탭을 여는 방법은 무엇입니까? (0) | 2020.11.23 |
Android Studio에 잘못된 파일 내용이 표시됨 (0) | 2020.11.23 |
사용자가 사용자 컨트롤 Asp.net MVC에 로그인했는지 확인 (0) | 2020.11.23 |
\ n 및 \ r \ n을 (0) | 2020.11.23 |