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

나는 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위치 서비스가 다시 작동하기 시작합니다.


답변

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

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

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

문안 인사

하이더


답변

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.추가 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


답변

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

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

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

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


답변

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