Apache Cordova
  1. Apache Cordova
  2. CB-64

navigator.geolocation.getCurrentPosition still timeouts

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.8.0
    • Component/s: iOS
    • Labels:
      None

      Issue Links

        Activity

        Hide
        Filip Maj added a comment -

        I do not think I can reproduce this. getCurrentLocation returns as expected on iOS now. Going to close this.

        Show
        Filip Maj added a comment - I do not think I can reproduce this. getCurrentLocation returns as expected on iOS now. Going to close this.
        Hide
        Filip Maj added a comment -

        Actually let's retest this once CB-359 lands, as that rewrites the entire geo plugin native to JS for a lot of platforms.

        Show
        Filip Maj added a comment - Actually let's retest this once CB-359 lands, as that rewrites the entire geo plugin native to JS for a lot of platforms.
        Hide
        Shazron Abdullah added a comment -

        This needs to be re-tested with the totally new geolocation implementation of 1.6.0 coming week of April 9th 2012.

        Show
        Shazron Abdullah added a comment - This needs to be re-tested with the totally new geolocation implementation of 1.6.0 coming week of April 9th 2012.
        Hide
        Shazron Abdullah added a comment -

        by: http://github.com/shazron (2011-10-05T23:46:21Z)

        This is already fixed. If this is a regression, this needs to be verifiable to be fixed. Post some test code.

        There's a reason why this is different from the built in navigator.geolocation - this is to work around the alert title. If it times out once in a while it is acceptable because of network conditions.

        by: http://github.com/shazron (2011-10-05T23:53:46Z)

        I tested using this: https://raw.github.com/gist/1251540/8d99e40dc331e1018b3d36e3b27d5018c19697fd/phonegap_geotest.html

        by: http://github.com/shazron (2011-10-05T23:55:07Z)

        Create a new PhoneGap 1.1 project, run it to make sure you get the "PhoneGap is working" alert. Then replace the index.html with the contents of https://raw.github.com/gist/1251540/8d99e40dc331e1018b3d36e3b27d5018c19697fd/phonegap_geotest.html

        by: http://github.com/magic-uyr (2011-10-13T10:12:35Z)

        the problem is the actual code, IOS wont constantly try and get a better fix, instead it seems to stop after about 3 times and wont respond unless the phone is moved, especially when your not on wifi.

        before the phonegap app appears, the plugin has already executed and tried to get a location 3 times, then phonegap pages show, then you call getCurrentLocation. this in turn calls to the location.m file that is currently waiting for you to move beyond 2 metres if you dont, javascript reaches it timeout and hence the reason.

        timeout should be set as infinity as advised, maxage should ideally be set at zero and if on 3G its best to try and get outside to activate the AGPS this is gps that uses WIFI and CELL to help get a better result.

        his is the modification to my code:

        NSTimeInterval localAge = -[newLocation.timestamp timeIntervalSinceNow];
        howManyTries++;
        if (localAge > 5.0)

        { NSLog(@"Got an old location"); return; }

        if (newLocation.horizontalAccuracy < 0)

        { NSLog(@"invalid measurements"); return; }

        NSLog(@"Tried %@ Times",[NSNumber numberWithInt:howManyTries]);
        // we are going to try 3 times, and always return whatever we have on the third attemp

        if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy){
        self.bestEffortAtLocation = newLocation;

        // lets see if we have a better accuracy I.E WIFI or GPS rather than Cell Tower
        if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy)

        { howManyTries = 0; NSLog(@"have got a better match"); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [bestEffortAtLocation JSONRepresentation]]; [super writeJavascript:jsCallback]; }


        else if ( howManyTries >= 3)

        { NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [bestEffortAtLocation JSONRepresentation]]; howManyTries = 0; [super writeJavascript:jsCallback]; }

        else

        { NSLog(@"not met desired accuracy yet!"); return; }

        }
        else
        {
        if( howManyTries >= 3 )

        { NSLog(@"Have done 5 times so i am now returning content"); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [bestEffortAtLocation JSONRepresentation]]; howManyTries = 0; [super writeJavascript:jsCallback]; }

        }

        this is inside location.m and didupdatetolocation this is only called once movement has been detected, so set timeout to Infinity on getCurrentLocation

        not sure if this is right, or bad or good or what! i am a complete IOS / object-c novice and is something i have just done from testing etc and just playing to see what happens.

        by: http://github.com/gregavola (2011-10-13T12:08:17Z)

        Has this been confirmed at all by the PhoneGap team?

        by: http://github.com/magic-uyr (2011-10-13T12:08:22Z)

        In xcode click on the phonegap project and go into classes i think
        From: gregavola
        Sent: 13 October 2011 12:58
        To: magic-uyr
        Subject: Re: [phonegap-iphone] navigator.geolocation.getCurrentPosition
        still timeouts (#304)
        How can you edit the location.m file?


        Reply to this email directly or view it on GitHub:
        https://github.com/phonegap/phonegap-iphone/issues/304#issuecomment-2393898

        by: http://github.com/magic-uyr (2011-10-13T12:57:39Z)

        nope not confirmed, the guy on the phonegap support asked me to post on here. plus if you use google or a simular search facility it details that it will wait for significant changes by default to save battery life etc. i have it working on mine so confirm or not, it seems to work in all situations, wifi or not wifi, not moving or moving and i dont use any battery either as i am not calling getCurrentLocation every min because my timeout is so low

        by: http://github.com/gregavola (2011-10-13T13:06:42Z)

        Awesome - I can't wait to try this. Can you outline what lines and where you added this in the Location.m file?

        by: http://github.com/gregavola (2011-10-13T14:42:22Z)

        @magic-uyr can you tell us where you placed the code?

        by: http://github.com/magic-uyr (2011-10-13T14:56:05Z)

        phonegap > classes > commands > location.h

        /*

        • PhoneGap is available under either the terms of the modified BSD license or the
        • Copyright (c) 2005-2010, Nitobi Software Inc.

        */

        #import

        #import

        #import "PGPlugin.h"

        enum HeadingStatus

        { HEADINGSTOPPED = 0, HEADINGSTARTING, HEADINGRUNNING, HEADINGERROR }

        ;

        t ypedef NSUInteger HeadingStatus;

        // simple object to keep track of heading information

        @interface PGHeadingData : NSObject

        { HeadingStatus headingStatus; BOOL headingRepeats; CLHeading* headingInfo; NSMutableArray* headingCallbacks; NSString* headingFilter; }

        @property (nonatomic, assign) HeadingStatus headingStatus;

        @property (nonatomic, assign) BOOL headingRepeats;

        @property (nonatomic, retain) CLHeading* headingInfo;

        @property (nonatomic, retain) NSMutableArray* headingCallbacks;

        @property (nonatomic, retain) NSString* headingFilter;

        @end

        @interface PGLocation : PGPlugin

        { @private BOOL __locationStarted; PGHeadingData* headingData; CLLocation *bestEffortAtLocation; NSInteger howManyTries; }

        @property (nonatomic, retain) CLLocationManager *locationManager;

        @property (nonatomic, retain) PGHeadingData* headingData;

        @property (nonatomic, retain) CLLocation *bestEffortAtLocation;

        • (BOOL) hasHeadingSupport;
        • (void)startLocation:(NSMutableArray*)arguments

        withDict:(NSMutableDictionary*)options;

        • (void)stopLocation:(NSMutableArray*)arguments

        withDict:(NSMutableDictionary*)options;

        • (void)locationManager:(CLLocationManager *)manager

        didUpdateToLocation:(CLLocation *)newLocation

        fromLocation:(CLLocation *)oldLocation;

        • (void)locationManager:(CLLocationManager *)manager

        didFailWithError:(NSError *)error;

        • (BOOL) isLocationServicesEnabled;
        • (void)getCurrentHeading:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
        • (void)returnHeadingInfo: (NSString*) callbackId keepCallback: (BOOL) bRetain;
        • (void)stopHeading:(NSMutableArray*)arguments

        withDict:(NSMutableDictionary*)options;

        • (void) startHeadingWithFilter: (CLLocationDegrees) filter;
        • (void)locationManager:(CLLocationManager *)manager

        didUpdateHeading:(CLHeading *)heading;

        • (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager;

        @end

        location.m

        • (void) locationManager:(CLLocationManager *)manager

        didUpdateToLocation:(CLLocation *)newLocation

        fromLocation:(CLLocation *)oldLocation

        {

        NSLog(@"got a new measurement, i think!");

        NSTimeInterval localAge = -[newLocation.timestamp timeIntervalSinceNow];

        howManyTries++;

        if (localAge > 5.0) return;

        if (newLocation.horizontalAccuracy < 0) return;

        if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy){

        self.bestEffortAtLocation = newLocation;

        // lets see if we have a better accuracy I.E WIFI or GPS rather than Cell Tower

        if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy)

        { howManyTries = 0; NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [newLocation JSONRepresentation]]; [super writeJavascript:jsCallback]; [self.locationManager stopUpdatingLocation]; __locationStarted = NO; howManyTries = 0; }

        else if ( howManyTries >= 3)

        { NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [newLocation JSONRepresentation]]; howManyTries = 0; [super writeJavascript:jsCallback]; [self.locationManager stopUpdatingLocation]; __locationStarted = NO; howManyTries = 0; }

        else

        { NSLog(@"not met desired accuracy yet!"); return; }

        }

        else

        {

        if( howManyTries >= 3 )

        { NSLog(@"Have done 5 times so i am now returning content"); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [newLocation JSONRepresentation]]; [super writeJavascript:jsCallback]; [self.locationManager stopUpdatingLocation]; __locationStarted = NO; howManyTries = 0; }

        }

        // catch any other return i may have missed

        return;

        }

        • (void) startLocation:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options

        {

        NSLog(@"Have started to look for you!");

        howManyTries = 0;

        if (![self isLocationServicesEnabled])

        {

        BOOL forcePrompt = NO;

        // if forcePrompt is true iPhone will still show the "Location Services not active." Settings | Cancel prompt.

        if ([options objectForKey:kPGLocationForcePromptKey])

        { forcePrompt = [[options objectForKey:kPGLocationForcePromptKey] boolValue]; }

        if (!forcePrompt)

        { NSError* error = [NSError errorWithDomain:kPGLocationErrorDomain code:1 userInfo: [NSDictionary dictionaryWithObject:@"Location services is not enabled" forKey:NSLocalizedDescriptionKey]]; NSLog(@"%@", [error JSONRepresentation]); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setError(%@);", [error JSONRepresentation]]; [super writeJavascript:jsCallback]; return; }

        }

        if (![self isAuthorized])

        {

        NSUInteger code = -1;

        BOOL authStatusAvailable = [CLLocationManager respondsToSelector:@selector(authorizationStatus)]; // iOS 4.2+

        if (authStatusAvailable)

        { code = [CLLocationManager authorizationStatus]; }

        NSError* error = [NSError errorWithDomain:NSCocoaErrorDomain code:code userInfo:

        [NSDictionary dictionaryWithObject:@"App is not authorized for Location Services" forKey:NSLocalizedDescriptionKey]];

        NSLog(@"%@", [error JSONRepresentation]);

        NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setError(%@);", [error JSONRepresentation]];

        [super writeJavascript:jsCallback];

        return;

        }

        // Tell the location manager to start notifying us of location updates

        self.locationManager.distanceFilter = kCLDistanceFilterNone;

        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

        [self.locationManager startUpdatingLocation];

        __locationStarted = YES;

        CLLocationAccuracy desiredAccuracy = kCLLocationAccuracyBest;

        if ([options objectForKey:kPGLocationDesiredAccuracyKey])

        {

        int desiredAccuracy_num = [(NSString *)[options objectForKey:kPGLocationDesiredAccuracyKey] integerValue];

        if (desiredAccuracy_num < 10)

        { desiredAccuracy = kCLLocationAccuracyBest; }

        else if (desiredAccuracy_num < 100) { desiredAccuracy = kCLLocationAccuracyNearestTenMeters; }

        else if (desiredAccuracy_num < 1000) { desiredAccuracy = kCLLocationAccuracyHundredMeters; }

        else if (desiredAccuracy_num < 3000) { desiredAccuracy = kCLLocationAccuracyKilometer; }

        else { desiredAccuracy = kCLLocationAccuracyBest; }

        NSLog(@"i have started looking for your location!");

        self.locationManager.desiredAccuracy = desiredAccuracy;

        }

        }

        @synthesize locationManager, headingData, bestEffortAtLocation;

        javascript phonegap.1.1.0.js

        Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options)

        {

        // create an always valid local success callback

        if ( this.listener !== null ) return;

        Log('Geo Location getCurrentPosition has been called');

        var win = successCallback;

        if (!win || typeof(win) != 'function') win = function(position) {};

        // create an always valid local error callback

        var fail = errorCallback;

        if (!fail || typeof(fail) != 'function') fail = function(positionError) {};

        var self = this;

        var totalTime = 0;

        var timeoutTimerId;

        // set params to our default values

        var params = new PositionOptions();

        params.maximumAge = 0;

        params.enableHighAccuracy = true;

        params.timeout = Infinity;

        this.listener =

        {"success":win,"fail":fail}

        ;

        this.start(params);

        var onTimeout = function()

        { self.setError( new PositionError( PositionError.TIMEOUT, "Geolocation Error: Timeout." ) ); }

        ;

        clearTimeout( this.timeoutTimerId );

        this.timeoutTimerId = setTimeout( onTimeout, Infinity );

        };

        my success code:

        function GeoSuccess( position )

        { Log('Got geo results'); setTimeout( "GetGeoLocation();",2000000 ); //setTimeout( "GetGeoLocation();", 10000 ); Log('\n Latitude: ' + position.coords.latitude + '\n' + 'Longitude: ' + position.coords.longitude + '\n' + 'Altitude: ' + position.coords.altitude + '\n' + 'Accuracy: ' + position.coords.accuracy + '\n' + 'Altitude Accuracy: ' + position.coords.altitudeAccuracy + '\n' + 'Heading: ' + position.coords.heading + '\n' + 'Speed: ' + position.coords.speed + '\n' + 'Timestamp: ' + new Date(position.timestamp) + '\n'); }

        thats it, you will have to get checks by phonegap as i said i am object-c novice and have litrally been doing object-c for about 3 days since i started using the plugin and couldn't get any help. if you do any useful changes then please let me know.

        ta

        by: http://github.com/gregavola (2011-10-13T19:25:03Z)

        You should def fork this into the build or some mod should test if it works!

        by: http://github.com/magic-uyr (2011-10-13T21:12:39Z)

        probably will once i get done, under huge pressure to get finished :-|

        by: http://github.com/gregavola (2011-10-15T15:29:01Z)

        Is there anything I can do to help here? I'm in despart need of help!

        by: http://github.com/gregavola (2011-10-19T20:45:34Z)

        Hey @magic-uyr - any luck here? Just wanted to reach out!

        by: http://github.com/schmitti12345 (2011-10-25T05:39:19Z)

        anything new?

        by: http://github.com/gregavola (2011-10-25T14:32:40Z)

        To my knowledge there is noting new for this issue. I've had to cache the location for the user on the first attempt and not have them request it again - but it just won't work unless they physically move their device.

        I wish this bug would be patched soon.

        by: http://github.com/schmitti12345 (2011-10-25T16:12:27Z)

        i posted it here again: 1(https://github.com/callback/callback-ios/issues/1)

        by: http://github.com/gregavola (2011-10-25T16:25:02Z)

        What is callback?

        by: http://github.com/magic-uyr (2011-10-25T16:36:30Z)

        You need to set your timeout to infinity and / or look for nearest
        match and return best results. There is no bug as such, its just
        phonegap dont do good or useful code, especially the geo plugin. Have a
        look on the apple developer site examples. The example code there is
        better than phonegaps effort and gives you an idea. Also geo works best
        with wifi chip enabled, u dnt need to be connected, just enabled and
        near hotspots for better and quicker results From: gregavola
        Sent: 25 October 2011 17:25
        To: magic-uyr
        Subject: Re: [phonegap-iphone] navigator.geolocation.getCurrentPosition
        still timeouts (#304)
        What is callback?


        Reply to this email directly or view it on GitHub:
        https://github.com/phonegap/phonegap-iphone/issues/304#issuecomment-2519340

        by: http://github.com/gregavola (2011-10-25T16:44:51Z)

        @magic-uyr It's defintely a bug - because it doesn't work out of the box. If you can fix it - you should do a pull request and plop the code in there so other devs can use it. I'm not an Obj-C guy - hence why I use PhoneGap. If you could outline your steps to put this into the current phonegap ap - that would be great. I saw your code- but I'm lost on where to put it on how to recompile.

        by: http://github.com/magic-uyr (2011-10-25T17:24:47Z)

        I dnt do phonegap anymore and i dnt do consultation you need to get a
        phonegap support account if u need something more robust and done for
        you. That is not directed to be rude in anyway, just sound advice From:
        gregavola
        Sent: 25 October 2011 17:44
        To: magic-uyr
        Subject: Re: [phonegap-iphone] navigator.geolocation.getCurrentPosition
        still timeouts (#304)
        @magic-uyr It's defintely a bug - because it doesn't work out of the
        box. If you can fix it - you should do a pull request and plop the
        code in there so other devs can use it. I'm not an Obj-C guy - hence
        why I use PhoneGap. If you could outline your steps to put this into
        the current phonegap ap - that would be great. I saw your code- but
        I'm lost on where to put it on how to recompile.


        Reply to this email directly or view it on GitHub:
        https://github.com/phonegap/phonegap-iphone/issues/304#issuecomment-2519595

        by: http://github.com/schmitti12345 (2011-10-25T18:07:37Z)

        PhoneGap is now Called Callback (because it was accepted as Apache Project):
        https://github.com/callback/callback-ios

        by: http://github.com/mydestination (2011-10-27T08:53:20Z)

        Hi Shazron, I have used your geo test page with 1.1.0 and recreated the problem with logfiles etc... The problem is evident when you are connected to wifi, it times out. If I disable wifi then it works as expected (or go out of range).

        Let me know if you want the logfiles, screen shots etc... I think for a lot of people this is still a big problem with Phonegap.

        Thanks Mark

        by: http://github.com/sromalewski (2011-10-30T22:49:22Z)

        @Shazron, your code works ok... BUT your situation is calling watchPosition once and then never calling it again.

        But if you have a situation where watchPosition is called, the position is successfully obtained, then you clear the watchID because you don't want to waste the phone's battery, and then your app is configured so the user can manually call watchPosition again, then this second or otherwise subsequent time that watchPosition is called, it times out. Neither the success nor the failure callbacks are ever called during these subsequent attempts.

        As @gregavola has pointed out in https://github.com/callback/callback-ios/issues/1 , you need to cache your lat/lon from the first watchPosition, then hopefully either reuse this, or force watchPosition to be called again – and hope for the best.

        by: http://github.com/Lichterloh (2011-11-26T22:43:04Z)

        Any news on this topic? I am facing the same issue with iOS 5.0.1 and Phonegap 1.2.0.

        Only solution till now is the usage of geolocation at the beginning, when the native api is not already started

        Show
        Shazron Abdullah added a comment - by: http://github.com/shazron (2011-10-05T23:46:21Z) This is already fixed. If this is a regression, this needs to be verifiable to be fixed. Post some test code. There's a reason why this is different from the built in navigator.geolocation - this is to work around the alert title. If it times out once in a while it is acceptable because of network conditions. by: http://github.com/shazron (2011-10-05T23:53:46Z) I tested using this: https://raw.github.com/gist/1251540/8d99e40dc331e1018b3d36e3b27d5018c19697fd/phonegap_geotest.html by: http://github.com/shazron (2011-10-05T23:55:07Z) Create a new PhoneGap 1.1 project, run it to make sure you get the "PhoneGap is working" alert. Then replace the index.html with the contents of https://raw.github.com/gist/1251540/8d99e40dc331e1018b3d36e3b27d5018c19697fd/phonegap_geotest.html by: http://github.com/magic-uyr (2011-10-13T10:12:35Z) the problem is the actual code, IOS wont constantly try and get a better fix, instead it seems to stop after about 3 times and wont respond unless the phone is moved, especially when your not on wifi. before the phonegap app appears, the plugin has already executed and tried to get a location 3 times, then phonegap pages show, then you call getCurrentLocation. this in turn calls to the location.m file that is currently waiting for you to move beyond 2 metres if you dont, javascript reaches it timeout and hence the reason. timeout should be set as infinity as advised, maxage should ideally be set at zero and if on 3G its best to try and get outside to activate the AGPS this is gps that uses WIFI and CELL to help get a better result. his is the modification to my code: NSTimeInterval localAge = - [newLocation.timestamp timeIntervalSinceNow] ; howManyTries++; if (localAge > 5.0) { NSLog(@"Got an old location"); return; } if (newLocation.horizontalAccuracy < 0) { NSLog(@"invalid measurements"); return; } NSLog(@"Tried %@ Times", [NSNumber numberWithInt:howManyTries] ); // we are going to try 3 times, and always return whatever we have on the third attemp if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy){ self.bestEffortAtLocation = newLocation; // lets see if we have a better accuracy I.E WIFI or GPS rather than Cell Tower if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { howManyTries = 0; NSLog(@"have got a better match"); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [bestEffortAtLocation JSONRepresentation]]; [super writeJavascript:jsCallback]; } else if ( howManyTries >= 3) { NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [bestEffortAtLocation JSONRepresentation]]; howManyTries = 0; [super writeJavascript:jsCallback]; } else { NSLog(@"not met desired accuracy yet!"); return; } } else { if( howManyTries >= 3 ) { NSLog(@"Have done 5 times so i am now returning content"); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [bestEffortAtLocation JSONRepresentation]]; howManyTries = 0; [super writeJavascript:jsCallback]; } } this is inside location.m and didupdatetolocation this is only called once movement has been detected, so set timeout to Infinity on getCurrentLocation not sure if this is right, or bad or good or what! i am a complete IOS / object-c novice and is something i have just done from testing etc and just playing to see what happens. by: http://github.com/gregavola (2011-10-13T12:08:17Z) Has this been confirmed at all by the PhoneGap team? by: http://github.com/magic-uyr (2011-10-13T12:08:22Z) In xcode click on the phonegap project and go into classes i think From: gregavola Sent: 13 October 2011 12:58 To: magic-uyr Subject: Re: [phonegap-iphone] navigator.geolocation.getCurrentPosition still timeouts (#304) How can you edit the location.m file? – Reply to this email directly or view it on GitHub: https://github.com/phonegap/phonegap-iphone/issues/304#issuecomment-2393898 by: http://github.com/magic-uyr (2011-10-13T12:57:39Z) nope not confirmed, the guy on the phonegap support asked me to post on here. plus if you use google or a simular search facility it details that it will wait for significant changes by default to save battery life etc. i have it working on mine so confirm or not, it seems to work in all situations, wifi or not wifi, not moving or moving and i dont use any battery either as i am not calling getCurrentLocation every min because my timeout is so low by: http://github.com/gregavola (2011-10-13T13:06:42Z) Awesome - I can't wait to try this. Can you outline what lines and where you added this in the Location.m file? by: http://github.com/gregavola (2011-10-13T14:42:22Z) @magic-uyr can you tell us where you placed the code? by: http://github.com/magic-uyr (2011-10-13T14:56:05Z) phonegap > classes > commands > location.h /* PhoneGap is available under either the terms of the modified BSD license or the MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. Copyright (c) 2005-2010, Nitobi Software Inc. */ #import #import #import "PGPlugin.h" enum HeadingStatus { HEADINGSTOPPED = 0, HEADINGSTARTING, HEADINGRUNNING, HEADINGERROR } ; t ypedef NSUInteger HeadingStatus; // simple object to keep track of heading information @interface PGHeadingData : NSObject { HeadingStatus headingStatus; BOOL headingRepeats; CLHeading* headingInfo; NSMutableArray* headingCallbacks; NSString* headingFilter; } @property (nonatomic, assign) HeadingStatus headingStatus; @property (nonatomic, assign) BOOL headingRepeats; @property (nonatomic, retain) CLHeading* headingInfo; @property (nonatomic, retain) NSMutableArray* headingCallbacks; @property (nonatomic, retain) NSString* headingFilter; @end @interface PGLocation : PGPlugin { @private BOOL __locationStarted; PGHeadingData* headingData; CLLocation *bestEffortAtLocation; NSInteger howManyTries; } @property (nonatomic, retain) CLLocationManager *locationManager; @property (nonatomic, retain) PGHeadingData* headingData; @property (nonatomic, retain) CLLocation *bestEffortAtLocation; (BOOL) hasHeadingSupport; (void)startLocation:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; (void)stopLocation:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error; (BOOL) isLocationServicesEnabled; (void)getCurrentHeading:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; (void)returnHeadingInfo: (NSString*) callbackId keepCallback: (BOOL) bRetain; (void)stopHeading:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; (void) startHeadingWithFilter: (CLLocationDegrees) filter; (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading; (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager; @end location.m (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"got a new measurement, i think!"); NSTimeInterval localAge = - [newLocation.timestamp timeIntervalSinceNow] ; howManyTries++; if (localAge > 5.0) return; if (newLocation.horizontalAccuracy < 0) return; if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy){ self.bestEffortAtLocation = newLocation; // lets see if we have a better accuracy I.E WIFI or GPS rather than Cell Tower if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { howManyTries = 0; NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [newLocation JSONRepresentation]]; [super writeJavascript:jsCallback]; [self.locationManager stopUpdatingLocation]; __locationStarted = NO; howManyTries = 0; } else if ( howManyTries >= 3) { NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [newLocation JSONRepresentation]]; howManyTries = 0; [super writeJavascript:jsCallback]; [self.locationManager stopUpdatingLocation]; __locationStarted = NO; howManyTries = 0; } else { NSLog(@"not met desired accuracy yet!"); return; } } else { if( howManyTries >= 3 ) { NSLog(@"Have done 5 times so i am now returning content"); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setLocation(%@);", [newLocation JSONRepresentation]]; [super writeJavascript:jsCallback]; [self.locationManager stopUpdatingLocation]; __locationStarted = NO; howManyTries = 0; } } // catch any other return i may have missed return; } (void) startLocation:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { NSLog(@"Have started to look for you!"); howManyTries = 0; if (! [self isLocationServicesEnabled] ) { BOOL forcePrompt = NO; // if forcePrompt is true iPhone will still show the "Location Services not active." Settings | Cancel prompt. if ( [options objectForKey:kPGLocationForcePromptKey] ) { forcePrompt = [[options objectForKey:kPGLocationForcePromptKey] boolValue]; } if (!forcePrompt) { NSError* error = [NSError errorWithDomain:kPGLocationErrorDomain code:1 userInfo: [NSDictionary dictionaryWithObject:@"Location services is not enabled" forKey:NSLocalizedDescriptionKey]]; NSLog(@"%@", [error JSONRepresentation]); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setError(%@);", [error JSONRepresentation]]; [super writeJavascript:jsCallback]; return; } } if (! [self isAuthorized] ) { NSUInteger code = -1; BOOL authStatusAvailable = [CLLocationManager respondsToSelector:@selector(authorizationStatus)] ; // iOS 4.2+ if (authStatusAvailable) { code = [CLLocationManager authorizationStatus]; } NSError* error = [NSError errorWithDomain:NSCocoaErrorDomain code:code userInfo: [NSDictionary dictionaryWithObject:@"App is not authorized for Location Services" forKey:NSLocalizedDescriptionKey] ]; NSLog(@"%@", [error JSONRepresentation] ); NSString* jsCallback = [NSString stringWithFormat:@"navigator.geolocation.setError(%@);", [error JSONRepresentation] ]; [super writeJavascript:jsCallback] ; return; } // Tell the location manager to start notifying us of location updates self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; [self.locationManager startUpdatingLocation] ; __locationStarted = YES; CLLocationAccuracy desiredAccuracy = kCLLocationAccuracyBest; if ( [options objectForKey:kPGLocationDesiredAccuracyKey] ) { int desiredAccuracy_num = [(NSString *) [options objectForKey:kPGLocationDesiredAccuracyKey] integerValue]; if (desiredAccuracy_num < 10) { desiredAccuracy = kCLLocationAccuracyBest; } else if (desiredAccuracy_num < 100) { desiredAccuracy = kCLLocationAccuracyNearestTenMeters; } else if (desiredAccuracy_num < 1000) { desiredAccuracy = kCLLocationAccuracyHundredMeters; } else if (desiredAccuracy_num < 3000) { desiredAccuracy = kCLLocationAccuracyKilometer; } else { desiredAccuracy = kCLLocationAccuracyBest; } NSLog(@"i have started looking for your location!"); self.locationManager.desiredAccuracy = desiredAccuracy; } } @synthesize locationManager, headingData, bestEffortAtLocation; javascript phonegap.1.1.0.js Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { // create an always valid local success callback if ( this.listener !== null ) return; Log('Geo Location getCurrentPosition has been called'); var win = successCallback; if (!win || typeof(win) != 'function') win = function(position) {}; // create an always valid local error callback var fail = errorCallback; if (!fail || typeof(fail) != 'function') fail = function(positionError) {}; var self = this; var totalTime = 0; var timeoutTimerId; // set params to our default values var params = new PositionOptions(); params.maximumAge = 0; params.enableHighAccuracy = true; params.timeout = Infinity; this.listener = {"success":win,"fail":fail} ; this.start(params); var onTimeout = function() { self.setError( new PositionError( PositionError.TIMEOUT, "Geolocation Error: Timeout." ) ); } ; clearTimeout( this.timeoutTimerId ); this.timeoutTimerId = setTimeout( onTimeout, Infinity ); }; my success code: function GeoSuccess( position ) { Log('Got geo results'); setTimeout( "GetGeoLocation();",2000000 ); //setTimeout( "GetGeoLocation();", 10000 ); Log('\n Latitude: ' + position.coords.latitude + '\n' + 'Longitude: ' + position.coords.longitude + '\n' + 'Altitude: ' + position.coords.altitude + '\n' + 'Accuracy: ' + position.coords.accuracy + '\n' + 'Altitude Accuracy: ' + position.coords.altitudeAccuracy + '\n' + 'Heading: ' + position.coords.heading + '\n' + 'Speed: ' + position.coords.speed + '\n' + 'Timestamp: ' + new Date(position.timestamp) + '\n'); } thats it, you will have to get checks by phonegap as i said i am object-c novice and have litrally been doing object-c for about 3 days since i started using the plugin and couldn't get any help. if you do any useful changes then please let me know. ta by: http://github.com/gregavola (2011-10-13T19:25:03Z) You should def fork this into the build or some mod should test if it works! by: http://github.com/magic-uyr (2011-10-13T21:12:39Z) probably will once i get done, under huge pressure to get finished :-| by: http://github.com/gregavola (2011-10-15T15:29:01Z) Is there anything I can do to help here? I'm in despart need of help! by: http://github.com/gregavola (2011-10-19T20:45:34Z) Hey @magic-uyr - any luck here? Just wanted to reach out! by: http://github.com/schmitti12345 (2011-10-25T05:39:19Z) anything new? by: http://github.com/gregavola (2011-10-25T14:32:40Z) To my knowledge there is noting new for this issue. I've had to cache the location for the user on the first attempt and not have them request it again - but it just won't work unless they physically move their device. I wish this bug would be patched soon. by: http://github.com/schmitti12345 (2011-10-25T16:12:27Z) i posted it here again: 1 ( https://github.com/callback/callback-ios/issues/1 ) by: http://github.com/gregavola (2011-10-25T16:25:02Z) What is callback? by: http://github.com/magic-uyr (2011-10-25T16:36:30Z) You need to set your timeout to infinity and / or look for nearest match and return best results. There is no bug as such, its just phonegap dont do good or useful code, especially the geo plugin. Have a look on the apple developer site examples. The example code there is better than phonegaps effort and gives you an idea. Also geo works best with wifi chip enabled, u dnt need to be connected, just enabled and near hotspots for better and quicker results From: gregavola Sent: 25 October 2011 17:25 To: magic-uyr Subject: Re: [phonegap-iphone] navigator.geolocation.getCurrentPosition still timeouts (#304) What is callback? – Reply to this email directly or view it on GitHub: https://github.com/phonegap/phonegap-iphone/issues/304#issuecomment-2519340 by: http://github.com/gregavola (2011-10-25T16:44:51Z) @magic-uyr It's defintely a bug - because it doesn't work out of the box. If you can fix it - you should do a pull request and plop the code in there so other devs can use it. I'm not an Obj-C guy - hence why I use PhoneGap. If you could outline your steps to put this into the current phonegap ap - that would be great. I saw your code- but I'm lost on where to put it on how to recompile. by: http://github.com/magic-uyr (2011-10-25T17:24:47Z) I dnt do phonegap anymore and i dnt do consultation you need to get a phonegap support account if u need something more robust and done for you. That is not directed to be rude in anyway, just sound advice From: gregavola Sent: 25 October 2011 17:44 To: magic-uyr Subject: Re: [phonegap-iphone] navigator.geolocation.getCurrentPosition still timeouts (#304) @magic-uyr It's defintely a bug - because it doesn't work out of the box. If you can fix it - you should do a pull request and plop the code in there so other devs can use it. I'm not an Obj-C guy - hence why I use PhoneGap. If you could outline your steps to put this into the current phonegap ap - that would be great. I saw your code- but I'm lost on where to put it on how to recompile. – Reply to this email directly or view it on GitHub: https://github.com/phonegap/phonegap-iphone/issues/304#issuecomment-2519595 by: http://github.com/schmitti12345 (2011-10-25T18:07:37Z) PhoneGap is now Called Callback (because it was accepted as Apache Project): https://github.com/callback/callback-ios by: http://github.com/mydestination (2011-10-27T08:53:20Z) Hi Shazron, I have used your geo test page with 1.1.0 and recreated the problem with logfiles etc... The problem is evident when you are connected to wifi, it times out. If I disable wifi then it works as expected (or go out of range). Let me know if you want the logfiles, screen shots etc... I think for a lot of people this is still a big problem with Phonegap. Thanks Mark by: http://github.com/sromalewski (2011-10-30T22:49:22Z) @Shazron, your code works ok... BUT your situation is calling watchPosition once and then never calling it again. But if you have a situation where watchPosition is called, the position is successfully obtained, then you clear the watchID because you don't want to waste the phone's battery, and then your app is configured so the user can manually call watchPosition again, then this second or otherwise subsequent time that watchPosition is called, it times out. Neither the success nor the failure callbacks are ever called during these subsequent attempts. As @gregavola has pointed out in https://github.com/callback/callback-ios/issues/1 , you need to cache your lat/lon from the first watchPosition, then hopefully either reuse this, or force watchPosition to be called again – and hope for the best. by: http://github.com/Lichterloh (2011-11-26T22:43:04Z) Any news on this topic? I am facing the same issue with iOS 5.0.1 and Phonegap 1.2.0. Only solution till now is the usage of geolocation at the beginning, when the native api is not already started

          People

          • Assignee:
            Filip Maj
            Reporter:
            Shazron Abdullah
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development