2012-03-14 18 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

答えは、メインスレッドから位置更新が行われなければならないということです。 チタンでは、関数の先頭でENSURE_UI_THREADを呼び出すだけです。

1

あなたがこの行にブレークポイントを入れて試してみてください:

[self.locationManager startUpdatingLocation]; 

あなたが今までのようにそこに着くかどうかを確認するためにあなたのコードからそれが実行されるという証拠はありません。