Установка карты вместе с текущим местоположением пользователя для OSX - PullRequest
0 голосов
/ 16 октября 2018

Приветствие профи,

Как я знаю, мы можем сделать карту с помощью API-интерфейса Google Map для IOS, как показано ниже.

import UIKit
import GoogleMaps
/* For cocoa:
   Import Cocoa
   Import MapKit
*/
   class ViewController: NSViewController, CLLocationManagerDelegate {

@IBOutlet var mapView: MKMapView!
var locationManager = CLLocationManager()
var didFindMyLocation = false
var strForCurLatitude = "";
var strForCurLongitude = "";
var currentLocation = locManager.location!


override func viewDidLoad() {
    super.viewDidLoad()

    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
    locationManager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse {
        print("User allowed us to access location")
    }
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Error while get location \(error)")
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location: CLLocation? = locationManager.location
    let coordinate: CLLocationCoordinate2D? = location?.coordinate
    print(coordinate!)
    print(coordinate!.latitude)
    print(coordinate!.longitude)
    strForCurLatitude = "\(coordinate!.latitude)"
    strForCurLongitude = "\(coordinate!.longitude)"
    let camera = GMSCameraPosition.camera(withLatitude: coordinate!.latitude, longitude: coordinate!.longitude, zoom: 15)
    let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
    mapView.isMyLocationEnabled = true
    self.view = mapView

    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(coordinate!.latitude, coordinate!.longitude)
    marker.map = mapView
}


override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
}
}

Но когда я попробовал подобный метод для osx ( Разница в том, что я использую mapkit вместо google map ), он говорит, что requestWhenInUseAuthorization () 'недоступен.Я красный эту тему Как получить местоположение пользователя?[macOS] но, похоже, без четкого определения, доступно ли оно для получения текущего местоположения для osx или нет.Так нельзя ли узнать текущее местоположение приложения macOS / cocoa?Если это не так, то как узнать текущее местоположение в приложении какао?

Я почти уверен, что многие программисты xcode, такие как я, пытались решить эту проблему.Любой ответ, вы получите большую оценку.:)

1 Ответ

0 голосов
/ 03 ноября 2018

requestWhenInUseAuthorization - это , недоступный в macOS.

Вот источник для подкласса NSViewController, который успешно проверяет менеджер местоположения и текущее местоположение в Xcode 10.1 на macOS 10.13.6:

import Cocoa
import MapKit
import CoreLocation

class MapViewController: NSViewController, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!
    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.delegate = self
        locationManager.startUpdatingLocation()
    }

    func locationManager(_ manager: CLLocationManager, 
                        didChangeAuthorization status: CLAuthorizationStatus) {
        print("location manager auth status changed to:" )
        switch status {
            case .restricted:
                print("status restricted")
            case .denied:
                print("status denied")

        case .authorized:
                print("status authorized")
                let location = locationManager.location
                print("location: \(String(describing: location))")

            case .authorizedAlways:
                print("status authorized always")
            case .notDetermined:
                print("status not yet determined")
        }


    }

    func locationManager(_ manager: CLLocationManager, 
                            didFailWithError error: Error) {
        print( "location manager failed with error \(error)" )
    }
}

работает для меня в macOS, если вы ответите «да» на приглашение «включить службы определения местоположения» при первом запуске приложения.

Обратите внимание, что вам также необходим список свойств NSLocationWhenInUseUsageDescriptionзапись, как указано в документации.

вывод консоли (слегка запутан):

статус авторизации менеджера местоположений изменен на: статус еще не определен статус авторизации менеджера местоположений изменен на: статус авторизованместоположение: Необязательно (<+ 4X.48, -12X.62632228> +/- 65,00 м (скорость -1,00 м / с / курс -1,00) @ 03.11.18, 11:42:48 по тихоокеанскому летнему времени)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...