使用XAMARIN在IOS 8中获取GPS位置

3

我是Xamarin的新手,我有一段用于获取GPS位置的代码,在iOS 6上运行良好,但在iOS 8上无法获取经度和纬度。

//Check for getting current lat/long
CLLocationCoordinate2D toLocation;
private CLLocationManager locationManager;
            if (!CLLocationManager.LocationServicesEnabled) {
                AppDelegate.currLat = "";
                AppDelegate.currLong = "";
                gpsFlag = false;
            } else {
                gpsFlag = true;
                locationManager = new CLLocationManager();
                locationManager.StartUpdatingLocation();
                if (locationManager.Location != null) {
                    toLocation = locationManager.Location.Coordinate;
                    AppDelegate.currLat = Convert.ToString (toLocation.Latitude);
                    AppDelegate.currLong = Convert.ToString (toLocation.Longitude);
                }
                locationManager.StopUpdatingLocation ();
            }
我正在使用通用模板在Xamarin中创建应用程序。 我已经进行了IOS 8 GPS位置的研究和开发,我知道我需要在info.plist中添加“NSLocationAlwaysUsageDescription”,但我不知道如何添加它。 getting-gps-location-using-core-location-in-ios-8 请帮助我如何获取IOS 8的GPS位置。

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
 public class LocationHelper
{
    private static bool _isTracking;
    public static bool IsTracking { get { return _isTracking; } }
    private static string _longitude;
    private static string _latitude;
    private static DateTime _lastUpdated;

    public static event EventHandler LocationUpdated;

    public static CLLocationManager LocationManager { private set; get; }

    public static void StartLocationManager(double distanceFilter, double accuracy)
    {
        LocationManager = new CLLocationManager();

        if (LocationManager.RespondsToSelector(new MonoTouch.ObjCRuntime.Selector("requestWhenInUseAuthorization")))
            LocationManager.RequestWhenInUseAuthorization();

        LocationManager.DistanceFilter = CLLocationDistance.FilterNone;
        LocationManager.DesiredAccuracy = accuracy;
        LocationManager.LocationsUpdated += LocationManager_LocationsUpdated;
        LocationManager.StartUpdatingLocation();


        _isTracking = true;

        System.Diagnostics.Debug.WriteLine("Location manager started ");
    }

    public static void StopLocationManager()
    {
        if (LocationManager != null)
        {
            LocationManager.LocationsUpdated -= LocationManager_LocationsUpdated;
            LocationManager = null;
            _isTracking = false;
        }

    }

    public static void Refresh()
    {
        LocationManager.StopUpdatingLocation();
        LocationManager.StartUpdatingLocation();
    }

    private static void LocationManager_LocationsUpdated(object sender, CLLocationsUpdatedEventArgs e)
    {
        if (LocationUpdated != null)
            LocationUpdated(null, null);

        UpdateLocation(e.Locations[e.Locations.Length - 1]);
    }

    private static void UpdateLocation(CLLocation location)
    {
        _longitude = location.Coordinate.Longitude.ToString();
        _latitude = location.Coordinate.Latitude.ToString();
        _lastUpdated = DateTime.Now;           
    }

    public static LocationResult GetLocationResult()
    {
        return new LocationResult(_latitude, _longitude, _lastUpdated);
    }

    public class LocationResult
    {
        public DateTime UpdatedTime { private set; get; }
        public string Latitude { private set; get; }
        public string Longitude { private set; get; }

        public LocationResult(string latitude, string longitude, DateTime updated)
        {
            UpdatedTime = updated;
            Latitude = latitude;
            Longitude = longitude;
        }

    }


}


这适用于iOS8。

我正在使用这个静态类,在获取坐标之前每次调用Refresh()方法。我找不到之前看到该解决方案的线程,但是这会立即返回位置,然后调用GetLocationResult()方法获取位置,并在完成locationManager操作后调用StopLocationManager()。


0

当您创建CLLocationmanager的新实例时,非常重要的是要调用以下内容:

manager = new CLLocationManager();

1.) manager.RequestWhenInUseAuthorization (); //如果您在前台执行任何操作,则使用此选项。 2.) manager.RequestAlwaysAuthorization ();// 如果您想在后台扫描,则使用此选项。

当然,这些仅适用于iOS 8方法,因此请确保使用:UIDevice.CurrentDevice.CheckSystemVersion(8,0); 进行版本检查。

但这还不足以提示用户访问位置。现在,您需要修改Info.plist!您需要添加一个名为NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription的新字符串条目。然后,您可以指定在尝试获取位置时要提示用户的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,