現在位置の地図の表示
import SwiftUI
import MapKit
class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
@Published var region = MKCoordinateRegion()
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
locations.last.map {
let center = CLLocationCoordinate2D(latitude: $0.coordinate.latitude, longitude: $0.coordinate.longitude)
let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
region = MKCoordinateRegion(center: center, span: span)
}
}
}
struct ContentView: View {
@StateObject private var manager = LocationManager()
var body: some View {
Map(coordinateRegion: $manager.region, showsUserLocation: true)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
//
// ViewController.swift
// MapKit003
//
// Created by Misato Morino on 2016/08/15.
// Copyright © 2016年 Misato Morino. All rights reserved.
//
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
var myMapView: MKMapView!
var myLocationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
// LocationManagerの生成.
myLocationManager = CLLocationManager()
// Delegateの設定.
myLocationManager.delegate = self
// 距離のフィルタ.
myLocationManager.distanceFilter = 100.0
// 精度.
myLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
// セキュリティ認証のステータスを取得.
let status = CLLocationManager.authorizationStatus()
// まだ認証が得られていない場合は、認証ダイアログを表示.
if(status != CLAuthorizationStatus.authorizedWhenInUse) {
print("not determined")
// まだ承認が得られていない場合は、認証ダイアログを表示.
myLocationManager.requestWhenInUseAuthorization()
}
// 位置情報の更新を開始.
myLocationManager.startUpdatingLocation()
// MapViewの生成.
myMapView = MKMapView()
// MapViewのサイズを画面全体に.
myMapView.frame = self.view.bounds
// Delegateを設定.
myMapView.delegate = self
// MapViewをViewに追加.
self.view.addSubview(myMapView)
// 中心点の緯度経度.
let myLat: CLLocationDegrees = 37.506804
let myLon: CLLocationDegrees = 139.930531
let myCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(myLat, myLon) as CLLocationCoordinate2D
// 縮尺.
let myLatDist : CLLocationDistance = 100
let myLonDist : CLLocationDistance = 100
// Regionを作成.
let myRegion: MKCoordinateRegion = MKCoordinateRegion(center: myCoordinate, latitudinalMeters: myLatDist, longitudinalMeters: myLonDist);
// MapViewに反映.
myMapView.setRegion(myRegion, animated: true)
}
// GPSから値を取得した際に呼び出されるメソッド.
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("didUpdateLocations")
// 配列から現在座標を取得.
let myLocations: NSArray = locations as NSArray
let myLastLocation: CLLocation = myLocations.lastObject as! CLLocation
let myLocation:CLLocationCoordinate2D = myLastLocation.coordinate
print("\(myLocation.latitude), \(myLocation.longitude)")
// 縮尺.
let myLatDist : CLLocationDistance = 100
let myLonDist : CLLocationDistance = 100
// Regionを作成.
let myRegion: MKCoordinateRegion = MKCoordinateRegion(center: myLocation, latitudinalMeters: myLatDist, longitudinalMeters: myLonDist);
// MapViewに反映.
myMapView.setRegion(myRegion, animated: true)
}
// Regionが変更した時に呼び出されるメソッド.
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
print("regionDidChangeAnimated")
}
// 認証が変更された時に呼び出されるメソッド.
private func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status{
case .authorizedWhenInUse:
print("AuthorizedWhenInUse")
case .authorizedAlways:
print("AuthorizedAlways")
case .denied:
print("Denied")
case .restricted:
print("Restricted")
case .notDetermined:
print("NotDetermined")
}
}
}
Info.plist
<key>NSLocationWhenInUseUsageDescription</key>
<string>使用目的</string>
上記の内容をinfo.plistに追加
Reference
- CLLocationManager