SWIFTにCllocationManagerDelegateメソッドを実装します
-
21-12-2019 - |
質問
今これをしっかりと働くために今すぐ働くことを試みています、そして私はここに来て、私はSwiftでcllocationManagerDelegateメソッドを使うことにどのように行くのですか?私はこれを私のクラスの上に置きました:
var locationManager = CLLocationManager()
.
私は次のことを私のviewDidLoad
メソッドに入れました:
locationManager.delegate = self
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
.
と私はこれらの委任メソッドを使用して使用しようとしました:
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
locationReceived = true
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
locationReceived = false
}
.
関数の前に@オプションを使ってみましたが、Xcodeはコンパイラエラーをスローします。任意のアイデア?
解決
まだ必須の場合は、PlistにNSLocationAlwaysUsageDescription
またはNSLocationWhenInUseUsageDescription
キーを追加する必要があります。
ios8 +は、これら2つの文字列のうちの1つを使用するには、位置を使用するように設定されます。あなたが使用するのはあなたが場所を尋ねる方法によって異なります。
-
アプリが開いて使用されていない場合でも、デバイスの場所を使用したいアプリの
NSLocationAlwaysUsageDescription
を使用します。 -
アプリケーションが開いて使用中の場合にのみ、デバイスの場所を使用したいアプリの
NSLocationWhenInUseUsageDescription
を使用します。
注:ビルドして実行する前に、デバイスからアプリを削除して、新しいインストールを行います。アプリがIOS8にアップグレードする前にアプリが場所を使用することを許可されている場合、それはあなたの許可を再度求められず、それらの文字列を設定したことを確認しません。削除とクリーンインストールを行うとこれが解決されます。
どちらかの文字列の設定は、「thisApp」を「allow」の行に沿ってインストール/最初に使用するように促してください。
これは plist ファイルのスクリーンショットです。
他のヒント
最初にPlistファイルの2行を追加する
1)NSloCationWheninuseUserSpressionscription
2)Nslocationalwaysusedesproction
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
}
func initLocationManager() {
seenError = false
locationFixAchieved = false
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.locationServicesEnabled
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
locationManager.stopUpdatingLocation()
if (error) {
if (seenError == false) {
seenError = true
print(error)
}
}
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
if (locationFixAchieved == false) {
locationFixAchieved = true
var locationArray = locations as NSArray
var locationObj = locationArray.lastObject as CLLocation
var coord = locationObj.coordinate
println(coord.latitude)
println(coord.longitude)
}
}
func locationManager(manager: CLLocationManager!,
didChangeAuthorizationStatus status: CLAuthorizationStatus) {
var shouldIAllow = false
switch status {
case CLAuthorizationStatus.Restricted:
locationStatus = "Restricted Access to location"
case CLAuthorizationStatus.Denied:
locationStatus = "User denied access to location"
case CLAuthorizationStatus.NotDetermined:
locationStatus = "Status not determined"
default:
locationStatus = "Allowed to location Access"
shouldIAllow = true
}
NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil)
if (shouldIAllow == true) {
NSLog("Location to Allowed")
// Start location services
locationManager.startUpdatingLocation()
} else {
NSLog("Denied access: \(locationStatus)")
}
}
. ユーザーの現在の場所を取得する: -
ステップ1: let locationManager = CLLocationManager() // make object of CLLocationManager class.
ステップ2: In viewDidLoad instantiate the CLLocationManager class like,
//バックグラウンドで使用する
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if (CLLocationManager.locationServicesEnabled())
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
.
ステップ3: CLLocationManager
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var locValue:CLLocationCoordinate2D = manager.location.coordinate
println("locations = \(locValue.latitude) \(locValue.longitude)")
}
.
ステップ4:
IOS 8のようにinfo.plistにNSLocationAlwaysUsageDescription
を追加することを忘れないでください。これを追加することは必須です。これはユーザーの場所を使用する許可を求めます。
私は同じ問題を持っていました。didupdateLocations - 機能していませんでした。あなたのアプリを実行してください。 [設定] - > [プライバシー] - > [場所]をオフにします。DidFailWERTRORは、ロケーションサービスが不在であることについてのエラーを捉えます。それから電源を入れます。その瞬間以来、didupdatelocationsは場所を捕まえます。
これは古いスレッドの少しですが、Swift 2.2 Xcode 7.3.1で私のために上記のどれも働いていませんでした。
問題は私が使っていたものです:
func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) {
print("Got location")
locationManager.stopUpdatingLocation()
}
.
とこれは呼ばれなかった。私が変更したとき:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("Got location")
locationManager.stopUpdatingLocation()
}
.
それはすべてうまくいった。[AnyObject]
を使用しているときに代理人が呼び出されていないようです。