2012-03-14 62 views
2

这与我的其他question有关,但是我只打开一个新的iOS标签,因为它可能是问题在原生端。CLLocationManager没有更新位置

问题:位置管理器没有更新位置。我试着阅读locationManager.location,它总是给我一个缓存位置。

然后我修改代码使用CLLocationManagerDelegate-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {} 永远不会被调用。

我的.h文件:

#import "TiModule.h" 
#import <CoreLocation/CoreLocation.h> 
#import <CoreMotion/CoreMotion.h> 

@interface TiMovementModule : TiModule<CLLocationManagerDelegate> 

@property (nonatomic, retain) CLLocationManager *locationManager; 
@property (nonatomic, readonly) NSDictionary *currentMovement; 

- (void)startMovementUpdates:(id)args; 
- (void)stopMovementUpdates:(id)args; 

@end 

.M

/** 
* Your Copyright Here 
* 
* Appcelerator Titanium is Copyright (c) 2009-2010 by Appcelerator, Inc. 
* and licensed under the Apache Public License (version 2) 
*/ 
#import "TiMovementModule.h" 
#import "TiBase.h" 
#import "TiHost.h" 
#import "TiUtils.h" 

@interface TiMovementModule() 

@property (nonatomic, retain) CMMotionManager *motionManager; 

@end 

@implementation TiMovementModule 

@synthesize motionManager, locationManager; 

#pragma mark Internal 

// this is generated for your module, please do not change it 
-(id)moduleGUID 
{ 
    return @"3d2abdb6-bafb-451c-931d-a979dcc1ea78"; 
} 

// this is generated for your module, please do not change it 
-(NSString*)moduleId 
{ 
    return @"ti.movement"; 
} 

#pragma mark Lifecycle 

-(void)startup 
{ 
    // this method is called when the module is first loaded 
    // you *must* call the superclass 
    [super startup]; 

    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.distanceFilter = kCLDistanceFilterNone; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 

    motionManager = [[CMMotionManager alloc] init]; 

    NSLog(@"[INFO] %@ loaded",self); //this prints 
} 

-(void)shutdown:(id)sender 
{ 
    // this method is called when the module is being unloaded 
    // typically this is during shutdown. make sure you don't do too 
    // much processing here or the app will be quit forceably 

    // you *must* call the superclass 
    [super shutdown:sender]; 
} 

#pragma mark Cleanup 

-(void)dealloc 
{ 
    self.motionManager = nil; 
    self.locationManager = nil; 

    [super dealloc]; 
} 

#pragma Public APIs 

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

    NSLog(@"I AM HEREEEEEE!!!!!!!"); //this never prints 

} 

- (void)startMovementUpdates:(id)args 
{ 
    NSLog(@"[INFO] starting updates..."); 

    [self.locationManager startUpdatingLocation]; 
    [motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical]; 
    NSLog(@"[INFO] started updates."); //this prints 
} 

- (void)stopMovementUpdates:(id)args 
{ 
    [locationManager stopUpdatingLocation]; 
    [motionManager stopDeviceMotionUpdates]; 
} 

- (id)currentMovement 
{ 
    NSDictionary *location = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithDouble:locationManager.location.coordinate.longitude], @"longitude", 
           [NSNumber numberWithDouble:locationManager.location.coordinate.latitude], @"latitude", 
           [NSNumber numberWithDouble:locationManager.location.altitude], @"altitude", 
           nil]; 

    NSDictionary *rotation = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithDouble:motionManager.deviceMotion.attitude.roll], @"roll", 
           [NSNumber numberWithDouble:motionManager.deviceMotion.attitude.pitch], @"pitch", 
           [NSNumber numberWithDouble:motionManager.deviceMotion.attitude.yaw], @"yaw", 
           nil]; 


    NSDictionary *movementData = [NSDictionary dictionaryWithObjectsAndKeys: 
            location, @"location", 
            rotation, @"rotation", 
            nil]; 
    return movementData; // here I pull location and it always gives me cached location. 
} 

@end 

回答

1

答案是位置更新必须从主线程完成。 在Titanium中,您只需在函数开头调用ENSURE_UI_THREAD。

1

你应该尝试把一个断点在这条线:

[self.locationManager startUpdatingLocation]; 

,看看如果你到达那里代码中没有证据表明它已经被执行。