나는 blue banner
지금 항상 나타나는 것을 제거하기 위해 iOS 11 SDK로 내 앱을 다시 빌드 했습니다. 나는 생각했다- "훌륭해, 그게 효과가 있었어", 단지 위치 서비스가 이제 전혀 작동하지 않는다는 것을 발견했다.
iOS 10에서 작동하는 데 사용 된 응용 프로그램-아무도 들어 본 적이 있습니까?
답변:
사과가 또 다른 개인 정보 보호 기능을 추가 한 것으로 보입니다. 사용자는 이제 우리를 재정의하고 다음으로 requestAlwaysAuthorization
다운 그레이드 할 수 있습니다. requestWhenInUseAuthorization
즉, 개발자로서 이제 두 설명을 모두 제공해야합니다.Info.plist
새 키를 추가 한 것으로 나타났습니다. NSLocationAlwaysAndWhenInUseUsageDescription
/*
* Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the
* NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription
* keys must be specified in your Info.plist; otherwise, this method will do
* nothing, as your app will be assumed not to support Always authorization.
*/
그러나이 새 키를 사용했을 때 위치 서비스는 여전히 작동하지 않았으며 추가 검색을 통해이 gem이 모든 추가 디버깅 정보와 섞여 있음을 발견했습니다.
이 앱은 사용 설명없이 개인 정보에 민감한 데이터에 액세스하려고했습니다. 앱의 Info.plist에는 앱이이 데이터를 사용하는 방법을 사용자에게 설명하는 문자열 값과 함께 NSLocationAlwaysAndWhenInUseUsageDescription 및 NSLocationWhenInUseUsageDescription 키가 모두 포함되어야합니다.
업데이트 된 CLLocationManager.h
파일 에서 찾은 주석과 직접 모순 됩니다. 그래서 레이더를 만들었습니다.
좋은 소식입니다. 디버깅 콘솔 IE의 조언을 따르면됩니다. 새 키 NSLocationAlwaysAndWhenInUseUsageDescription
와 이전 키 중 하나를 모두 추가하면 NSLocationWhenInUseUsageDescription
위치 서비스가 다시 작동하기 시작합니다.
NSLocationAlwaysUsageDescription
중이며 필요한 권한 인 Info.plist에 추가했습니다. 그러나 콘솔에 위의 메시지도 표시됩니다 NSLocationWhenInUseUsageDescription
.
startUpdatingLocation
하고 requestLocation
있습니까?
startUpdatingLocation
이 문제를 해결하는 단계를 추가하기 만하면됩니다.
2 가지 방법 :
A) 쉬운 방법 : Info.plist 파일을 선택하고 속성을 추가 한 다음 LOCATION 대신 PRIVCY로 시작한다는 점에 유의하세요. 따라서 이러한 변수의 정확한 이름은 "Privacy-Location ..."등으로 시작합니다. 여기에 각각 표시하고 사용자가 경고에서이를 어떻게 볼 것인지 설명하십시오.
B) 어렵고 / 흥미롭고 / 프로그래밍 방식 (나는이 방식이 더 좋습니다) :
앱의 Info.plist를 마우스 오른쪽 버튼으로 클릭 한 다음 "소스 코드보기"를 선택하면 모두 XML로 표시되어야합니다.
다른 ...... 형식을 따르고 다음 속성을 추가합니다.
<key>NSLocationAlwaysUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>
저장하고 info.plist 파일을 마우스 오른쪽 단추로 클릭 한 다음 속성 목록을 선택합니다. 그러면 파일이 기본보기로 다시 표시됩니다.
편집하다:
다른 회원이 코드를 요청했는데 다음과 같습니다.
1) .H 파일에 다음을 추가하십시오.
@property (strong, nonatomic) CLLocationManager *LocationManager;
2) .M 파일에서 ViewDidAppear () 함수 아래에 추가하십시오.
_LocationManager = [[CLLocationManager alloc] init];
[_LocationManager setDelegate:self];
_LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
_LocationManager.pausesLocationUpdatesAutomatically = NO;
[_LocationManager requestAlwaysAuthorization];
_LocationManager.headingFilter = 5;
_LocationManager.distanceFilter = 0;
[_LocationManager startUpdatingLocation];
[_LocationManager startUpdatingHeading];
이것이 나를 위해 잘 작동하는 것은 코드가 당신에게도 효과가 있기를 바랍니다.
문안 인사
하이더
viewwillAppear
하고 대리자를 제거합니다 viewwilldisapper
. 설정으로 이동하여 이미 선택한 Allow Always
. 업데이트를 한 번만 받고 더 이상받지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어. 미리 감사드립니다 !!
iOS11에서 작업하면서 Info.plist는 Info.plist에서 최소한 NSLocationAlwaysAndWhenInUseUsageDescription이 필요하다는 것을 발견했습니다.
이상한 충분히 때 응용 프로그램이 다국어 사용자 문자열의 지역화 된 버전이 필요로하는 세 가지 키 다른이 게시물에서 언급 requestAlwaysAuthorization()
하고locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
자동으로 실패합니다.
예를 들어 독일어 번역을 보여주는 샷 :
이것이 걸려 넘어 질 때 시간을 절약하기를 바랍니다.
Swift 4.0.3에서 작업
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
"항상 승인"이 필요한 앱에서 동일한 문제가 발생했으며 다음 단계에 따라 문제를 해결했습니다.
1. 키 추가 NSLocationWhenInUseUsageDescription
Info.plist
2. 추가 NSLocationAlwaysAndWhenInUseUsageDescription
로Info.plist
3. 추가 NSLocationAlwaysUsageDescription
로 Info.plist
(지원 <아이폰 OS 11)
4. 전화하기 requestWhenInUseAuthorization()
전에 requestAlwaysAuthorization(
)
requestWhenInUseAuthorization () 전에 requestAlwaysAuthorization ()을 실행할 수 없습니다. 해당 권한 수준으로 에스컬레이션해야합니다. 이렇게 변경 한 후 위치 업데이트가 다시 제대로 작동하기 시작했습니다.
자세한 내용은 여기에서 확인할 수 있습니다.
Swift 5로 iOS 12.2 에서 테스트 됨
1 단계. plist 파일에 다음 개인 정보 권한을 추가해야합니다.
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>
2 단계. 현재 위치를 확인하려면 다음과 같은 빠른 코드가 있는지 확인하십시오.
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
// MARK: Variables declearations
@IBOutlet weak var mapView: MKMapView!
var locationManager: CLLocationManager!
// MARK: View Controller life cycle methods
override func viewDidLoad() {
super.viewDidLoad()
//TODO: Make user you must add following three privacy permissions in plist
//NSLocationWhenInUseUsageDescription
//NSLocationAlwaysAndWhenInUseUsageDescription
//NSLocationAlwaysUsageDescription
getCurrentLocation()
}
func getCurrentLocation()
{
if (CLLocationManager.locationServicesEnabled())
{
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
}
// MARK: Location Manager Delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let locationsObj = locations.last! as CLLocation
print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
showOnMap(location: locationsObj)
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Get Location failed")
}
func showOnMap(location: CLLocation )
{
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
mapView.setRegion(region, animated: true)
}
}
스위프트 : 3 같은 문제에 직면했습니다. 나는 해결책을 찾기 위해 완전히 망했다. 여기에 문제를 해결 한 방법이 있습니다.
1 단계 : 프로젝트 파일> 기능> 배경 모드> 위치 업데이트 선택
2 단계 : Info.plist에 NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription 키 추가
3 단계 :
manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true