私は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を更新してみました。しかし、それは機能していません。ところで、シミュレーターのプライバシー設定で常に選択した場合、すぐにアプリに戻ると機能します。誰か助けてもらえますか?私のコンソールでは「認証されていません」と表示されるので、これが問題だと確信しています。
何か助けは?
これはiOS 8関連の問題です。 NSLocationAlwaysUsageDescription
キーまたはNSLocationWhenInUseUsageDescription
キーを.plist
ファイルに配置する必要があります(値は、ロケーションアラートに表示される追加メッセージである場合があります)。これらのキーはiOS 8で必要です。
このキーは、CLLocationManagerクラスのrequestAlwaysAuthorizationメソッドを使用して位置情報サービスの承認を要求するときに必要です。このキーが存在せず、requestAlwaysAuthorizationメソッドを呼び出すと、システムはリクエストを無視し、アプリが位置情報サービスを使用できないようにします。
私は、NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescriptionキーをplistに追加した後も持続する同様の問題に苦労していました。
結局、privacyに「Privacy-Location Usage Description」キーを(新しいキーに加えて)追加し、できあがりました。それが機能した後、plistから「Privacy-Location Usage Description」キーを削除し、引き続き正常に承認をリクエストすることができました。
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キーを設定してください
私はplistを直接編集したくないので、UIを使用して常にオートライズを許可します。
オランダ語のテキスト「Toegang is nodig」と「Toegang is noodzakelijk」は、使用されているユーザーがアクセスを許可しているポップアップに表示されます。これらを好きなテキストに変更できます。
単にplistソースに追加し、
<key>NSLocationAlwaysUsageDescription</key>
<string>To get location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>To get location</string>
私はまったく同じ問題を抱えていました。
記録としては、これは公式の答えではありません。最初の答えは正しいものです。私は、修正を示す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はちょっときしむ。パッチがすぐに出てくると思います。
Swift 2の場合、respondsToSelector()チェックをiOSバージョンチェックに置き換えました。それほどエレガントではありませんが、Xcode 7がエラー0、警告0を出力するために必要です。
if #available(iOS 8.0, *) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}