вторник, 7 июля 2015 г.

Where am I App

Запускаем XCode и Создаем приложение:

Выбираем Single View Application.

Language: Swift
Devices: IPhone

Добавляем зависимости:

Для этого щелкаем по знаку + в разделе Link Binary With Libraries.

Добавляем 2 фреймворка:

CoreLocation

И MapKit





Выбираем в Project Navigator (Левое меню) Main.storyboard :

Добавляем из Object Library MapKitView:


Добавляем Delegate k ViewController правым щелчком по MapKitView вызвав меню:


Для того что бы ОС разрешила нам определять текущее местоположение устройства необходимо запросить у пользователя разрешение. В Project Manager выбираем Supporting Files -> Info.pllist
Открываем как Source Code:
Добавляем строки:
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>App need to know(when it starts) your location</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>App tracking your location to calculate your activity time</string>


 Естественно, что для настоящего приложения необходимы более убедительные объяснения.


Переходим во ViewController.swift и импортируем фреймворки:

import MapKit
import CoreLocation



Добавляем интерфейсы делегатов MKMapViewDelegate, CLLocationManagerDelegate к классу:

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

Добавляем outlet MKMapView с именем map:


@IBOutlet weak var map: MKMapView!


Исходный текст с комментариями

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var map: MKMapView!
   
    var manager = CLLocationManager() // CoreLocation manager
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        initializeManager() // CoreLocation manager initializations
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

   
    func initializeManager() {
        manager.delegate = self // Устанавливаем delegate
        manager.desiredAccuracy = kCLLocationAccuracyBest //Устанавливаем точность
        manager.requestWhenInUseAuthorization() // Запрашиваем разрешение на получение данных о местонахождении (1 раз)
        manager.startUpdatingLocation() // Начинаем получать данные о текущем положении
    }
   
    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { //callback вызываемый после получения данных о местоположении
//        println("locations : \(locations)") // отладка
       
        var currentLocation:CLLocation = locations[0] as! CLLocation // Получаем самые свежие данные о текущем положении
        var latitude = currentLocation.coordinate.latitude // широта
        var longitude = currentLocation.coordinate.longitude // долгота
        let speed = currentLocation.speed
        let altitude = currentLocation.altitude
        let accuracy = currentLocation.horizontalAccuracy
       
        var dict = ["latitude": latitude, "longitude": longitude]
       
        label.text = "latitude \(latitude), longitude \(longitude), altitude \(altitude), speed \(speed), accuracy \(accuracy)"
       
        setRegion(setLocation(dict)) //устанавливаем текущее местоположение на карте
    }
   
    func setLocation(dict: Dictionary<String, CLLocationDegrees>) -> CLLocationCoordinate2D{ // helper для получения location:CLLocationCoordinate2D
       
       
        var latitude:CLLocationDegrees = dict["latitude"]! // получаем широту из словаря - параметр функции
        var longitude:CLLocationDegrees = dict["longitude"]! // получаем долготу из словаря - параметр функции
       
        var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
       
        return location
    }
   
    func setRegion(location: CLLocationCoordinate2D) {  // helper для установки текущего местоположения на карте
        var latDelta:CLLocationDegrees = 0.01 // точность при определении широты
        var lonDelta:CLLocationDegrees = 0.01 // точность при определении долготы
       
        var span:MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: latDelta, longitudeDelta: lonDelta) // точность
        var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span) // текущее местоположение
       
        map.setRegion(region, animated: true) // установка текущего местоположения на карте
    }
}

Комментариев нет:

Отправить комментарий