ユーザーの現在位置を保存し、その位置を地図に表示する方法を教えてください。
地図上に定義済みの座標を表示することはできますが、デバイスから情報を受け取る方法がわかりません。
また、私はいくつかの項目をPlistに追加しなければならないことを知っています。どうやってやるの?
ユーザーの現在位置を取得するには、次のように宣言する必要があります。
let locationManager = CLLocationManager()
viewDidLoad()
では、CLLocationManager
クラスをインスタンス化する必要があります。
// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
その後、CLLocationManagerDelegateメソッドで、ユーザーの現在の位置座標を取得できます。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
Info.plistにNSLocationAlwaysUsageDescription
とあなたのカスタム警告メッセージを追加する必要があります。 AppName(Demo App)はあなたの現在の場所を使用したいと思います。
あなたはそれらのステップをするべきです:
CoreLocation.framework
を追加 - >ライブラリとバイナリをリンク(XCode 7.2.1以降は不要)CoreLocation
をあなたのクラスにインポートする - おそらくViewController.SwiftCLLocationManagerDelegate
を追加するNSLocationWhenInUseUsageDescription
とNSLocationAlwaysUsageDescription
を追加するinitロケーションマネージャ:
locationManager = CLLocationManager()
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
ユーザーロケーションを取得します。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
iOS 12.2 を と一緒に更新 - Swift 5
plistファイルに次のプライバシー権限を追加する必要があります
<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
これが私のやり方です
現在地を取得してSwift 2.0の地図に表示する
プロジェクトに CoreLocation および MapKit フレームワークを追加したことを確認してください(これはXCode 7.2.1では必要ありません)
import Foundation
import CoreLocation
import MapKit
class DiscoverViewController : UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var map: MKMapView!
var locationManager: CLLocationManager!
override func viewDidLoad()
{
super.viewDidLoad()
if (CLLocationManager.locationServicesEnabled())
{
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let location = locations.last! as CLLocation
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
self.map.setRegion(region, animated: true)
}
}
これが結果画面です
NSLocationWhenInUseUsageDescription =アプリがバックグラウンドで実行されているときに位置情報サービスを使用する許可を要求します。あなたのplistファイルに。
これでうまくいくなら、答えを投票してください。
最初のCorelocationとMapKitライブラリをインポートします。
import MapKit
import CoreLocation
cLLocationManagerDelegateからクラスに継承する
class ViewController: UIViewController, CLLocationManagerDelegate
locationManager変数を作成します。これはあなたの位置データになります。
var locationManager = CLLocationManager()
位置情報を取得するための関数を作成します。具体的には、この正確な構文は機能します。
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
あなたの関数の中でユーザーの現在位置を表す定数を作成する
let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration
位置の更新を停止すると、移動中に端末が常に位置を中央に移動することができなくなります(他の機能を使用する場合は省略できます)。
manager.stopUpdatingLocation()
今定義したuserLocatinからユーザーの座標を取得します。
let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
地図のズーム倍率を定義します。
let span = MKCoordinateSpanMake(0.2,0.2)
は、この2つを組み合わせて地域を取得します。
let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance
今度は地域を設定し、あなたがそれをアニメーションでそこに行くことを望むかどうかを選択してください
mapView.setRegion(region, animated: true)
関数を閉じます}
ボタンなどから、locationManagerDelegetをselfに設定します。
今すぐ場所が表示されるのを許可します。
精度を指定する
locationManager.desiredAccuracy = kCLLocationAccuracyBest
承認する:
locationManager.requestWhenInUseAuthorization()
位置情報サービスを認証するには、この2行をplistに追加する必要があります
場所を取得:
locationManager.startUpdatingLocation()
ユーザーに見せてください。
mapView.showsUserLocation = true
これは私の完全なコードです:
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func locateMe(sender: UIBarButtonItem) {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
mapView.showsUserLocation = true
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation:CLLocation = locations[0] as CLLocation
manager.stopUpdatingLocation()
let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
let span = MKCoordinateSpanMake(0.2,0.2)
let region = MKCoordinateRegion(center: coordinations, span: span)
mapView.setRegion(region, animated: true)
}
}
ライブラリをインポートする:
import CoreLocation
デリゲートを設定します。
CLLocationManagerDelegate
次のように変数を取ります。
var locationManager:CLLocationManager!
ViewDidLoad()で、このきれいなコードを書きます。
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled(){
locationManager.startUpdatingLocation()
}
CLLocationデリゲートメソッドを書く:
//MARK: - location delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation :CLLocation = locations[0] as CLLocation
print("user latitude = \(userLocation.coordinate.latitude)")
print("user longitude = \(userLocation.coordinate.longitude)")
self.labelLat.text = "\(userLocation.coordinate.latitude)"
self.labelLongi.text = "\(userLocation.coordinate.longitude)"
let geocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
if (error != nil){
print("error in reverseGeocode")
}
let placemark = placemarks! as [CLPlacemark]
if placemark.count>0{
let placemark = placemarks![0]
print(placemark.locality!)
print(placemark.administrativeArea!)
print(placemark.country!)
self.labelAdd.text = "\(placemark.locality!), \(placemark.administrativeArea!), \(placemark.country!)"
}
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Error \(error)")
}
場所へのアクセス権を設定します。そのため、これらのキー値を info.plist fileに追加します。
<key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
100%問題なく動作しています。テスト済み
Swift 3.0
地図でユーザーの位置を表示したくないが、それをfirebaseまたは他の場所に保存したい場合は、次の手順に従います。
import MapKit
import CoreLocation
今すぐあなたのVCでCLLocationManagerDelegateを使ってください、そしてあなたは以下に示される最後の3つのメソッドをオーバーライドしなければなりません。これらのメソッドを使用して、requestLocation()メソッドがどのようにして現在のユーザーの所在地を取得するのかを確認できます。
class MyVc: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
isAuthorizedtoGetUserLocation()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
}
}
//if we have no permission to access user location, then ask user for permission.
func isAuthorizedtoGetUserLocation() {
if CLLocationManager.authorizationStatus() != .authorizedWhenInUse {
locationManager.requestWhenInUseAuthorization()
}
}
//this method will be called each time when a user change his location access preference.
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
print("User allowed us to access location")
//do whatever init activities here.
}
}
//this method is called by the framework on locationManager.requestLocation();
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("Did location updates is called")
//store the user location here to firebase or somewhere
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Did location updates is called but failed getting location \(error)")
}
}
ユーザーがアプリにサインインしたら、以下の呼び出しをコーディングできます。 requestLocation()が呼び出されると、上記のdidUpdateLocationsがさらに呼び出され、その場所をFirebaseまたは他の場所に保存できます。
if CLLocationManager.locationServicesEnabled() {
locationManager.requestLocation();
}
geoFireを使用している場合は、上記のdidUpdateLocationsメソッドで以下のように場所を保存できます。
geoFire?.setLocation(locations.first, forKey: uid) where uid is the user id who logged in to the app. I think you will know how to get UID based on your app sign in implementation.
大事なことを言い忘れましたが、あなたのInfo.plistに行き、 "Use Usage Description"の時には、Privacy-Locationを有効にしてください。
シミュレータを使用してテストするときは、シミュレータ - >デバッグ - >場所で設定したカスタムの場所を常に1つ指定します。
最初にプロジェクトに2つのフレームワークを追加します
1: MapKit
2: 共割り当て (XCode 7.2.1以降は不要)
クラスで定義する
var manager:CLLocationManager!
var myLocations: [CLLocation] = []
次にviewDidLoadメソッドのコードでこれを
manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestAlwaysAuthorization()
manager.startUpdatingLocation()
//Setup our Map View
mapobj.showsUserLocation = true
plistファイルにこれら2つの値を追加することを忘れないでください
1: NSLocationWhenInUseUsageDescription
2: NSLocationAlwaysUsageDescription
override func viewDidLoad() {
super.viewDidLoad()
locationManager.requestWhenInUseAuthorization();
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
else{
print("Location service disabled");
}
}
これはあなたのビューがloadメソッドを行ったことであり、ViewControllerクラスには次のようにmapStart更新メソッドも含まれています。
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var locValue : CLLocationCoordinate2D = manager.location.coordinate;
let span2 = MKCoordinateSpanMake(1, 1)
let long = locValue.longitude;
let lat = locValue.latitude;
print(long);
print(lat);
let loadlocation = CLLocationCoordinate2D(
latitude: lat, longitude: long
)
mapView.centerCoordinate = loadlocation;
locationManager.stopUpdatingLocation();
}
また、 あなたのプロジェクトにCoreLocation.FrameWorkとMapKit.Frameworkを追加することを忘れないでください ( XCode 7.2.1以降は不要になりました )
import CoreLocation
import UIKit
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status != .authorizedWhenInUse {return}
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
let locValue: CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
}
requestWhenInUseAuthorization
の呼び出しは非同期であるため、アプリケーションは、ユーザーが許可を与えた後、またはそれを拒否した後にlocationManager
関数を呼び出します。そのため、ユーザーに許可が与えられている場合は、コードを取得する場所をその関数内に配置するのが適切です。 これは私が見つけたこれに関する最良のチュートリアルです 。
使用法:
クラス内のフィールドを定義
let getLocation = GetLocation()
簡単なコードでクラスの機能に使う:
getLocation.run {
if let location = $0 {
print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
} else {
print("Get Location failed \(getLocation.didFailWithError)")
}
}
クラス:
import CoreLocation
public class GetLocation: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
var locationCallback: ((CLLocation?) -> Void)!
var locationServicesEnabled = false
var didFailWithError: Error?
public func run(callback: @escaping (CLLocation?) -> Void) {
locationCallback = callback
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
manager.requestWhenInUseAuthorization()
locationServicesEnabled = CLLocationManager.locationServicesEnabled()
if locationServicesEnabled { manager.startUpdatingLocation() }
else { locationCallback(nil) }
}
public func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
locationCallback(locations.last!)
manager.stopUpdatingLocation()
}
public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
didFailWithError = error
locationCallback(nil)
manager.stopUpdatingLocation()
}
deinit {
manager.stopUpdatingLocation()
}
}
// its with strongboard
@IBOutlet weak var mapView: MKMapView!
//12.9767415,77.6903967 - exact location latitude n longitude location
let cooridinate = CLLocationCoordinate2D(latitude: 12.9767415 , longitude: 77.6903967)
let spanDegree = MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
let region = MKCoordinateRegion(center: cooridinate , span: spanDegree)
mapView.setRegion(region, animated: true)
iOS Swift 4で100%作業している人:Parmar Sajjad
ステップ1:後藤GoogleDeveloper APIコンソールそしてあなたのApiKeyを作成しなさい
ステップ2:Goto ProjectがCocoapods GoogleMapsポッドをインストールする
ステップ3:AppDelegate.SwiftからGoogleMapsをインポートして
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
GMSServices.provideAPIKey("ApiKey")
return true
}
ステップ4:UIKitをインポートするGoogleMapsクラスをインポートするViewController:UIViewController、CLLocationManagerDelegate {
@IBOutlet weak var mapview: UIView!
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManagerSetting()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManagerSetting() {
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
self.showCurrentLocationonMap()
self.locationManager.stopUpdatingLocation()
}
func showCurrentLocationonMap() {
let
cameraposition = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)! , longitude: (self.locationManager.location?.coordinate.longitude)!, zoom: 18)
let mapviewposition = GMSMapView.map(withFrame: CGRect(x: 0, y: 0, width: self.mapview.frame.size.width, height: self.mapview.frame.size.height), camera: cameraposition)
mapviewposition.settings.myLocationButton = true
mapviewposition.isMyLocationEnabled = true
let marker = GMSMarker()
marker.position = cameraposition.target
marker.snippet = "Macczeb Technologies"
marker.appearAnimation = GMSMarkerAnimation.pop
marker.map = mapviewposition
self.mapview.addSubview(mapviewposition)
}
}
ステップ5:info.plistファイルを開き、下に追加プライバシー - 使用中の場所使用法の説明......メインストーリーボードファイルのベース名の下
ステップ6:実行
これが私のために働いたコピーペーストの例です。
http://swiftdeveloperblog.com/code-examples/determine-users-current-location-example-in-Swift/ /
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager:CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
determineMyCurrentLocation()
}
func determineMyCurrentLocation() {
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.startUpdatingLocation()
//locationManager.startUpdatingHeading()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation:CLLocation = locations[0] as CLLocation
// Call stopUpdatingLocation() to stop listening for location updates,
// other wise this function will be called every time when user location changes.
// manager.stopUpdatingLocation()
print("user latitude = \(userLocation.coordinate.latitude)")
print("user longitude = \(userLocation.coordinate.longitude)")
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
{
print("Error \(error)")
}
}