web-dev-qa-db-ja.com

SwiftでCLLocationManagerDelegateメソッドを実装する

私はこれをしばらくの間機能させようとしていましたが、ここに来て尋ねました-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
}

また、関数の前で@optionalを使用しようとしましたが、Xcodeはコンパイラエラーをスローします。何か案は?

26
user1327904

PlistにNSLocationAlwaysUsageDescriptionまたはNSLocationWhenInUseUsageDescriptionキーを追加する必要があります(まだ必須ではない場合)。


iOS8 +では、場所を使用するようにこれら2つの文字列のいずれかを設定する必要があります。どちらを使用するかは、場所をどのように求めるかによって異なります。

  • アプリが開いていて使用されていない場合でも、デバイスの位置を使用するアプリにはNSLocationAlwaysUsageDescriptionを使用します。

  • アプリが開いて使用中の場合にのみデバイスの位置を使用するアプリには、NSLocationWhenInUseUsageDescriptionを使用します。

注:文字列を追加したら、ビルドして実行する前に、デバイスからアプリを削除して、新規インストールを実行します。 iOS8にアップグレードする前にアプリが場所の使用を許可されていた場合、再度許可を求められることはなく、これらの文字列を設定したことはわかりません。削除およびクリーンインストールを実行すると、これが解決します。

いずれかの文字列を設定すると、インストール/最初の使用時に「Appを使用していないときでも「ThisApp」が位置にアクセスできるようにする」というポップアップが表示されます。

これは、plistファイルのScreenshotです。

enter image description here

57
DelightedD0D

最初にこの2行をplistファイルに追加します

1)NSLocationWhenInUseUsageDescription

2)NSLocationAlwaysUsageDescription

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

ユーザーの現在地を取得するには:-

ステップ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: Info.plistにNSLocationAlwaysUsageDescriptionを追加することを忘れないでください。iOS8ではこれを追加することが必須です。これにより、ユーザーの場所を使用する許可が求められます。

4
Annu

同じ問題がありました。 didUpdateLocations-動作していませんでした。アプリを実行します。 [設定]ページ-> [プライバシー]-> [位置情報]に移動し、位置情報サービスをオフにします。 didFailWithErrorは、位置情報サービスの不在に関するエラーをキャッチします。次に、電源を入れます。その瞬間から、didUpdateLocationsは場所をキャッチします。

3
salty

これは少し古いスレッドですが、上記のいずれも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]の使用時にデリゲートが呼び出されないようです

0
Pedro Silva