web-dev-qa-db-ja.com

CLLocationManagerの認証の問題iOS 8

私はSwiftコードの一部に取り組んでいます。私は場所を含む何かをしようとしています、それで私は私のSwift =コントローラファイルを表示:

let locationManger:CLLocationManager = CLLocationManager()

var speedReceived:Double = 0

override func viewDidLoad() {
    super.viewDidLoad()
    locationManger.delegate = self
    locationManger.desiredAccuracy = kCLLocationAccuracyBest
    let authstate = CLLocationManager.authorizationStatus()
    if(authstate == CLAuthorizationStatus.NotDetermined){
       println("Not Authorised")  
      locationManger.requestWhenInUseAuthorization()
    }
    // Do any additional setup after loading the view, typically from a nib.
}

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
    var location:CLLocation = locations[locations.count - 1] as CLLocation
    if(location.horizontalAccuracy > 0){
        self.speedReceived = location.speed
        println(self.speedReceived)
    }
}

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
   println("Couldn't get your location")
}

ただし、このコードを機能させることができないようです。ロケーションの使用に関する私の設定は保存されません。位置情報へのアクセスを許可するように要求することさえしませんinfo.plistを更新してみました。しかし、それは機能していません。ところで、シミュレーターのプライバシー設定で常に選択した場合、すぐにアプリに戻ると機能します。誰か助けてもらえますか?私のコンソールでは「認証されていません」と表示されるので、これが問題だと確信しています。

何か助けは?

16
brisi123

これはiOS 8関連の問題です。 NSLocationAlwaysUsageDescriptionキーまたはNSLocationWhenInUseUsageDescriptionキーを.plistファイルに配置する必要があります(値は、ロケーションアラートに表示される追加メッセージである場合があります)。これらのキーはiOS 8で必要です。

Appleガイドラインでの表記

このキーは、CLLocationManagerクラスのrequestAlwaysAuthorizationメソッドを使用して位置情報サービスの承認を要求するときに必要です。このキーが存在せず、requestAlwaysAuthorizationメソッドを呼び出すと、システムはリクエストを無視し、アプリが位置情報サービスを使用できないようにします。

28
Alex Peda

私は、NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescriptionキーをplistに追加した後も持続する同様の問題に苦労していました。

結局、privacyに「Privacy-Location Usage Description」キーを(新しいキーに加えて)追加し、できあがりました。それが機能した後、plistから「Privacy-Location Usage Description」キーを削除し、引き続き正常に承認をリクエストすることができました。

7
Cole Richards

iOS 8は位置認証戦略を変更しました。下位互換性のあるソリューション:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
    [self.locationManager respondsToSelector:requestSelector]) {
    [self.locationManager performSelector:requestSelector withObject:NULL];
} else {
    [self.locationManager startUpdatingLocation];
}

注意:Info.plistでNSLocationWhenInUseUsageDescriptionキーを設定してください

4
hrchen

私はplistを直接編集したくないので、UIを使用して常にオートライズを許可します。

enter image description here

オランダ語のテキスト「Toegang is nodig」と「Toegang is noodzakelijk」は、使用されているユーザーがアクセスを許可しているポップアップに表示されます。これらを好きなテキストに変更できます。

単にplistソースに追加し、

<key>NSLocationAlwaysUsageDescription</key>
<string>To get location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>To get location</string>
2
Vincent

私はまったく同じ問題を抱えていました。

記録としては、これは公式の答えではありません。最初の答えは正しいものです。私は、修正を示すFOSS(Objective-C)プロジェクトへのリンクを追加したかっただけです。

前述のように、キーを追加する必要がありました。アプリはバックグラウンドで実行する必要がないので、info.plistに NSLocationWhenInUseUsageDescription キーを追加しました。

このキーの値として文字列を追加する場合(オプション-キーの存在はバーを設定するのに十分です)、その文字列は認証ポップアップに表示されます。

次に、すべての[CLLocationManager startUpdating]呼び出しの前に次のコードを追加しました。

if ( [locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] )
{
    [locationManager requestWhenInUseAuthorization];
}

呼び出しはiOS 8でのみ使用できるため、respondsToSelectorは重要です。

これが初めて呼び出されたときに、アラートが表示されます。その後、それは抜け落ちます。

requestWhenInUseAuthorization を呼び出すことに注意してください

これは、plistに入力した値と一致する必要があります。あなたは両方を置くことができると思いますが、私は知りません。私はする必要はありませんでした。

プロジェクトは here です。作業のほとんど(それほどではない)は BMLTAppDelegate.m ファイルにあります。

これは意外な驚きです。多くの人々は、彼らのアプリがiOS 8で動作しなくなることを理解していません。彼らは、私が最初に行ったのと同じことを行います。

現在、別の問題があります。すべてのアプリは修正されていますが、アプリをApp StoreにアップロードしようとするとXcodeがクラッシュします。レーダーを開いています。

Xcode 6はちょっときしむ。パッチがすぐに出てくると思います。

2
Chris Marshall

Swift 2の場合、respondsToSelector()チェックをiOSバージョンチェックに置き換えました。それほどエレガントではありませんが、Xcode 7がエラー0、警告0を出力するために必要です。

if #available(iOS 8.0, *) {
    locationManager.requestWhenInUseAuthorization()
} else {
    locationManager.startUpdatingLocation()
}
1
Carl