Search code examples
iosgeolocationappcelerator

Appcelerator Geolocation never returns a speed on iOS


I'm using Appcelerator to provide a geo track. This works very well on Android, but on the iOS platform I am not getting speed or heading information from the onLocation event.

I initialise my GPS:

permissions.requestLocationPermissions(Ti.Geolocation.AUTHORIZATION_ALWAYS, function (e) {
    if (e.success && !configuredMonitoring) {
        if (OS_IOS) {
            Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_BEST;
            Ti.Geolocation.distanceFilter = 5;
            Ti.Geolocation.preferredProvider = Ti.Geolocation.PROVIDER_GPS;
            Ti.Geolocation.pauseLocationUpdateAutomatically = true;
            Ti.Geolocation.activityType = Ti.Geolocation.ACTIVITYTYPE_OTHER_NAVIGATION;
        }

        if (OS_ANDROID) {
            Ti.Geolocation.Android.addLocationProvider(Ti.Geolocation.Android.createLocationProvider({
                name: Ti.Geolocation.PROVIDER_GPS,
                minUpdateDistance: 10,
                minUpdateTime: 1
            }));
            Ti.Geolocation.Android.addLocationRule(Ti.Geolocation.Android.createLocationRule({
                provider: Ti.Geolocation.PROVIDER_GPS,
                accuracy: 10,
                maxAge: 5000,
                minAge: 1000
            }));
            Ti.Geolocation.Android.addLocationProvider(Ti.Geolocation.Android.createLocationProvider({
                name: Ti.Geolocation.PROVIDER_NETWORK,
                minUpdateDistance: 10,
                minUpdateTime: 1
            }));
            Ti.Geolocation.Android.addLocationRule(Ti.Geolocation.Android.createLocationRule({
                provider: Ti.Geolocation.PROVIDER_NETWORK,
                accuracy: 10,
                maxAge: 5000,
                minAge: 1000
            }));
            Ti.Geolocation.Android.manualMode = true;
        }
}

Then I add eventlisteners for iOS location updates being paused

if (Ti.Geolocation.locationServicesEnabled){
  Ti.Geolocation.addEventListener('location', onLocation);
  if (OS_IOS) {
    Ti.Geolocation.addEventListener('locationupdatepaused', onLocationupdate);
    Ti.Geolocation.addEventListener('locationupdateresumed', onLocationupdate);
  }
}

My onLocation function runs function onLocation(e) {

    if (!e.error) {
        var coords = e.coords;
        console.log(JSON.stringify(e));
    } else {
        console.log('Error!':+JSON.stringify(e))
    }
}

in my return data I see

{
    "success":true,
    "coords:{
        "timestamp":1488757841662,
        "speed":-1,
        "longitude":173.2793426513672,
        "floor":{"level":0},
        "latitude":-41.274879455566406,
        "accuracy":65,
        "heading":-1,
        "altitude":3.9126133918762207,
        "altitudeAccuracy":10
    },
    "code":0,
    "bubbles":true,
    "type":"location",
    "source":{
        "preferredProvider":null
    },
    "cancelBubble":false
}

I never see anything other than -1 in my speed or heading, which according to the documentation: "On iOS, a negative value indicates that the heading data is not valid."

What am I doing wrong here?


Solution

  • We had this same issue and were pulling our hair out trying to figure it out. Try changing Ti.Geolocation.ACCURACY_BEST to Ti.Geolocation.ACCURACY_BEST_FOR_NAVIGATION. This fixed it for us.