1

我有一个使用 CLLocation 管理器的应用程序,我需要能够强制传递位置事件。苹果文档指出...

在返回当前位置定位后,接收器仅在检测到用户位置发生重大变化时才生成更新事件。例如,当设备与不同的蜂窝塔相关联时,它可能会生成一个新事件。它不依赖 distanceFilter 属性中的值来生成事件。连续多次调用此方法不会自动生成新事件。但是,在这两者之间调用 stopMonitoringSignificantLocationChanges 确实会在您下次调用此方法时发送一个新的初始事件。

所以我读到了,因为我可以调用 stopMonitoringSignificantLocationChanges 然后 startMonitoringSignificantLocationChanges 并接收位置事件,但是,实际上这不起作用。请参阅下面的代码(我已删除部分内容,以免泄露私有反向地理 API)。这是一个将反向地理与 CLLocationManager 结合起来的包装类。在我的演示应用程序中,我调用 beginMonitoringSignificantChanges 然后 stopMonitoringSignificantChanges 我只看到 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 在我更改位置或首次安装应用程序时调用,而不是当我停止和开始。有什么想法吗?

//
//  TTGeoWrapper.m
//  LocationManagementDemoApp
//
//  Created by Kyle Jurick on 12/17/12.
//  Copyright (c) 2012 Kyle Jurick. All rights reserved.
//

#import "TTGeoWrapper.h"
#import "OpenXML.h"

@implementation TTGeoWrapper
-(id)initWith//removed code
{
    self = [super init];
    if (self) {
        //removed code
        _transactionTimeout=30;
        //removed code
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        authorizationStatus = [CLLocationManager authorizationStatus];
        if (authorizationStatus != kCLAuthorizationStatusAuthorized) {
            ableToMonitorLocation = false;
        }
        else
        {
            ableToMonitorLocation = true;
        }

    }

    return self;
}

-(void)dealloc
{
    locationManager.delegate = nil;
}

-(void)beginMonitoringSignificantChanges
{
    //if (ableToMonitorLocation) {
        [locationManager startMonitoringSignificantLocationChanges];
    /*}
    NSMutableDictionary *requestFailureUserInfo = [[NSMutableDictionary alloc] init];
    [requestFailureUserInfo setValue:@"NOT AUTHORIZED" forKey:@"FAILURE REASON"];
    [requestFailureUserInfo setValue:[NSString stringWithFormat:@"%d", authorizationStatus] forKey:@"FAILURE REASON"];
    NSError *requestFailure = [[NSError alloc] initWithDomain:@"TTGeoWrapper" code:0 userInfo:requestFailureUserInfo];
    [_delegate requestDidFail:requestFailure TTGeoWrapper:self];*/
}

-(void)stopMonitoringSignificantChanges
{
    [locationManager stopMonitoringSignificantLocationChanges];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//per Apple documentation, the last item in the array is the most current location
        //http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLLocationManagerDelegate_Protocol/CLLocationManagerDelegate/CLLocationManagerDelegate.html
    int latestPollIndex = locations.count-1;
    CLLocation *location = [locations objectAtIndex:latestPollIndex];
    _timeStamp = location.timestamp;
    CLLocationCoordinate2D coordinate = [location coordinate];
    [self updateLocationWithLatAsync:coordinate.latitude Long:coordinate.longitude];
}

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:    (CLAuthorizationStatus)status
{
    if (status != kCLAuthorizationStatusAuthorized) {
        ableToMonitorLocation = false;
    }
    authorizationStatus = status;
}

-(NSString *)updateLocationWithLatAsync:(float)latitude Long:(float)longitude;
{
    webRequest = [ASIHTTPRequest requestWithURL:[[NSURL alloc] initWithString:_URL]];
    [webRequest setDelegate:self];
    [webRequest setTimeOutSeconds:_transactionTimeout];
    [self buildPacketLat:latitude Long:longitude];
    PostGUID = [self generateUuidString];
    [self getPostResponseAsync];
    return PostGUID;
}

-(NSString *)updateLocationWithLatSync:(float)latitude Long:(float)longitude
{
    webRequest = [ASIHTTPRequest requestWithURL:[[NSURL alloc] initWithString:_URL]];
    [webRequest setDelegate:self];
    [webRequest setTimeOutSeconds:_transactionTimeout];
    [self buildPacketLat:latitude Long:longitude];
    PostGUID = [self generateUuidString];
    [self getPostResponse];
    return PostGUID;
}

-(void)buildPacketLat:(float)latitude Long:(float)longitude
{
//removed code
    [webRequest appendPostData:[requestXML dataUsingEncoding:NSASCIIStringEncoding]];
}

- (NSString *)generateUuidString
{
    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
    CFStringRef str = CFUUIDCreateString(kCFAllocatorDefault, uuid);
    NSString *uuidString = (__bridge NSString *)str;
    CFRelease(uuid);
    CFRelease(str);
    return uuidString;
}

-(void)getPostResponse
{
    NSLog(@"Beginning Synchronous POST");
    [webRequest startSynchronous];
}

-(void)getPostResponseAsync
{
    NSLog(@"Beginning Asynchronous POST");
    [webRequest startAsynchronous];
}

-(void)cancelAsyncRequest
{
    NSLog(@"Cancelling Asynchronous POST");
    [webRequest cancel];
}

-(void)requestFinished:(ASIHTTPRequest *)request
{
    OpenXML *geoResponse = [[OpenXML alloc] initWithData:[request responseData]];
    _LocationToXMLString = [geoResponse openXMLToString];
    _LocationToOpenXML = geoResponse;
//removed code
else
{
    NSMutableDictionary *requestFailureUserInfo = [[NSMutableDictionary alloc] init];
    //removed code
    NSError *requestFailure = [[NSError alloc] initWithDomain:@"TTGeoWrapper" code:0 userInfo:requestFailureUserInfo];
    [_delegate requestDidFail:requestFailure TTGeoWrapper:self];
}
}

-(void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *requestFailure = [request error];
    [_delegate requestDidFail:requestFailure TTGeoWrapper:self];
}
@end
4

2 回答 2

2

显然,这仅在您每次都重新初始化 CLLocationManager 时才有效。文档似乎不支持这一点,但我的测试确实支持。如果有人有更好的答案,我很想听听。

于 2013-06-18T19:38:24.587 回答
0

你说的对。只有重新初始化 CLLocationManager 才会导致发生重要位置更改更新。如果您需要新的位置更新,那么为什么不使用标准位置服务呢?使用该标准,您还可以获得更准确的修复。

于 2013-06-18T19:53:11.183 回答