私はこれをしばらくの間機能させようとしていましたが、ここに来て尋ねました-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はコンパイラエラーをスローします。何か案は?
PlistにNSLocationAlwaysUsageDescription
またはNSLocationWhenInUseUsageDescription
キーを追加する必要があります(まだ必須ではない場合)。
iOS8 +では、場所を使用するようにこれら2つの文字列のいずれかを設定する必要があります。どちらを使用するかは、場所をどのように求めるかによって異なります。
アプリが開いていて使用されていない場合でも、デバイスの位置を使用するアプリにはNSLocationAlwaysUsageDescription
を使用します。
アプリが開いて使用中の場合にのみデバイスの位置を使用するアプリには、NSLocationWhenInUseUsageDescription
を使用します。
注:文字列を追加したら、ビルドして実行する前に、デバイスからアプリを削除して、新規インストールを実行します。 iOS8にアップグレードする前にアプリが場所の使用を許可されていた場合、再度許可を求められることはなく、これらの文字列を設定したことはわかりません。削除およびクリーンインストールを実行すると、これが解決します。
いずれかの文字列を設定すると、インストール/最初の使用時に「Appを使用していないときでも「ThisApp」が位置にアクセスできるようにする」というポップアップが表示されます。
これは、plistファイルのScreenshotです。
最初にこの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)")
}
}
ユーザーの現在地を取得するには:-
ステップ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ではこれを追加することが必須です。これにより、ユーザーの場所を使用する許可が求められます。
同じ問題がありました。 didUpdateLocations-動作していませんでした。アプリを実行します。 [設定]ページ-> [プライバシー]-> [位置情報]に移動し、位置情報サービスをオフにします。 didFailWithErrorは、位置情報サービスの不在に関するエラーをキャッチします。次に、電源を入れます。その瞬間から、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]の使用時にデリゲートが呼び出されないようです