iOS 11에서 작동하지 않는 위치 서비스


83

나는 blue banner지금 항상 나타나는 것을 제거하기 위해 iOS 11 SDK로 내 앱을 다시 빌드 했습니다. 나는 생각했다- "훌륭해, 그게 효과가 있었어", 단지 위치 서비스가 이제 전혀 작동하지 않는다는 것을 발견했다.

iOS 10에서 작동하는 데 사용 된 응용 프로그램-아무도 들어 본 적이 있습니까?


의 Info.plist에 NSLocationAlwaysAndWhenInUseUsageDescription 추가
Jayprakash Dubey에게

답변:


156

사과가 또 다른 개인 정보 보호 기능을 추가 한 것으로 보입니다. 사용자는 이제 우리를 재정의하고 다음으로 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위치 서비스가 다시 작동하기 시작합니다.


2
나는 매우 비슷한 상황에 직면 해 있습니다. iOS 10.2에서 테스트 NSLocationAlwaysUsageDescription중이며 필요한 권한 인 Info.plist에 추가했습니다. 그러나 콘솔에 위의 메시지도 표시됩니다 NSLocationWhenInUseUsageDescription.
ISURU

7
안타깝게도 사용자는 이제 세 가지 답변이 포함 된 대화를 얻습니다. 사용자가 시작하는 데 참을성이 없어서 맞을 가능성이 가장 높은 것은 "앱을 사용하는 동안에 만"이라는 최고의 선택입니다. 사용자가 나중에 다시 설정을 변경하는 모든 번거 로움을 겪지 않는 한 항상 사용이 필요한 앱을 쓸모 없게 만듭니다. 앱이 요구하는 것이 가장 좋은 선택은 "항상 허용"이어야합니다.
Hans Terje Bakke

1
세 가지 설명 키를 모두 추가했지만 여전히 위치 업데이트를받지 못하고 있습니다. viewwillAppear에 locationmanagerdelgate를 추가하고 viewwilldisapper에서 대리자를 제거합니다. 설정으로 이동하여 이미 선택한 항상 허용을 선택합니다. 업데이트를 한 번만 받고 더 이상받지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어. 미리 감사드립니다 !!
LoveMeSomeFood 2017-10-02

@Uma-전화 startUpdatingLocation하고 requestLocation있습니까?
William George

@WilliamGeorge 내가 사용하고startUpdatingLocation
LoveMeSomeFood

43

이 문제를 해결하는 단계를 추가하기 만하면됩니다.

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];

이것이 나를 위해 잘 작동하는 것은 코드가 당신에게도 효과가 있기를 바랍니다.

문안 인사

하이더


1
3 개의 설명 키를 모두 추가했지만 여전히 위치 업데이트를받지 못하고 있습니다. 에서 locationmanagerdelgate를 추가 viewwillAppear 하고 대리자를 제거합니다 viewwilldisapper. 설정으로 이동하여 이미 선택한 Allow Always. 업데이트를 한 번만 받고 더 이상받지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어. 미리 감사드립니다 !!
LoveMeSomeFood 2017-10-02

나를 위해 일하고 있는지 설명하기 위해 지금 내 코드를 추가합니다 :
하이더 사티

나는 당신과 같은 코드를 가지고 있습니다. 그래도 집에 가서 앱으로 돌아 오지 않으면 위치 업데이트를받지 못합니다. 이것은 iOS 11에서만 발생합니다. 여전히 이유를 알 수 없습니다.
LoveMeSomeFood 2017-10-06

이 스레드를 살펴볼 수 있습니까? stackoverflow.com/questions/46616496/... . 감사합니다!
LoveMeSomeFood

안녕하세요 Uma, 사용자 중 한 명이 장치 중 하나에서 동일한 문제를보고했습니다.이 문제를 조사 중이며 다시 연락 드리겠습니다. IOS11이 현재 우리 모두를 매우 바쁘게 만들고있는 것 같습니다. ... 나를 참아주세요, 빨리 덕분에이 문제를 해결
하이더 사티

23

iOS11에서 작업하면서 Info.plist는 Info.plist에서 최소한 NSLocationAlwaysAndWhenInUseUsageDescription이 필요하다는 것을 발견했습니다.

여기에 이미지 설명 입력

이상한 충분히 때 응용 프로그램이 다국어 사용자 문자열의 지역화 된 버전이 필요로하는 세 가지 키 다른이 게시물에서 언급 requestAlwaysAuthorization()하고locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) 자동으로 실패합니다.

예를 들어 독일어 번역을 보여주는 샷 :

여기에 이미지 설명 입력

이것이 걸려 넘어 질 때 시간을 절약하기를 바랍니다.


감사합니다, @iDoc! 이것은 저에게 많은 시간을 절약했습니다.
Reinhard Männer

이것은 정답입니다. iOS 11에서는 위치 개인 정보 키를 현지화해야합니다.
jberlana

10 시간 후 나는이 포스트에 도착한다… tnx
1110

17

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>  

감사 vipulkumarmehta
Keshav 게라

13

이 단계를 따르세요:

"항상 승인"이 필요한 앱에서 동일한 문제가 발생했으며 다음 단계에 따라 문제를 해결했습니다.

1.추가 NSLocationWhenInUseUsageDescriptionInfo.plist

2. 추가 NSLocationAlwaysAndWhenInUseUsageDescriptionInfo.plist

3. 추가 NSLocationAlwaysUsageDescriptionInfo.plist(지원 <아이폰 OS 11)

4. 전화하기 requestWhenInUseAuthorization() 전에 requestAlwaysAuthorization( )

requestWhenInUseAuthorization () 전에 requestAlwaysAuthorization ()을 실행할 수 없습니다. 해당 권한 수준으로 에스컬레이션해야합니다. 이렇게 변경 한 후 위치 업데이트가 다시 제대로 작동하기 시작했습니다.

자세한 내용은 여기에서 확인할 수 있습니다.

https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization


1
아무것도 그 :(으로 변경되지 않습니다
Cemal BAYRI을

플래그 allowBackgroundLocationUpdates를 활성화하여 해결했습니다. 참조 stackoverflow.com/a/50733860/2610888
안드레아 Gorrieri

6

죄송합니다보다 안전합니다 .. iOS 11에서 : 아래를 추가하면 좋습니다.

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>

5

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)
    }
}

2

스위프트 : 3 같은 문제에 직면했습니다. 나는 해결책을 찾기 위해 완전히 망했다. 여기에 문제를 해결 한 방법이 있습니다.

1 단계 : 프로젝트 파일> 기능> 배경 모드> 위치 업데이트 선택

2 단계 : Info.plist에 NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription 키 추가

3 단계 :

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

allowBackgroundLocationUpdates는 내 문제를 확실히 해결했으며 다른 응답 및 포럼에보고되지 않았다는 사실을 믿을 수 없습니다. Apple 문서에서 : "이 속성을 사용하여 프로그래밍 방식으로 백그라운드 업데이트를 활성화 및 비활성화합니다. 예를 들어 사용자가 백그라운드 업데이트가 필요한 앱에서 기능을 활성화 한 후에 만이 속성을 true로 설정할 수 있습니다." "이 속성의 기본값은 false입니다." developer.apple.com/documentation/corelocation/...
안드레아 Gorrieri에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.