Во-первых, заявление об отказе от ответственности заключается в том, что я нацеливаюсь на iOS 5, так что очень хорошо может быть источником моих проблем, но если нет ...
Я пытаюсь написать простой класс, которыйуправляет обновлениями местоположения через CoreLocation.Тем не менее, я вижу довольно странное поведение.У меня есть собственный класс, который в основном обертывает CLLocationManager и методы делегата.Это интерфейс:
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@protocol CLZipCodeFetcherDelegate
@optional - (void)didReceiveZipCode:(NSString *)zipCode;
@end
@interface CLZipCodeFetcher : NSObject <CLLocationManagerDelegate> {
id <CLZipCodeFetcherDelegate> delegate;
CLLocationManager *locationManager;
}
@property (strong, readwrite) id <CLZipCodeFetcherDelegate> delegate;
@property (strong, read write) CLLocationManager *locationManager;
- (void)getZipCode;
@end
и реализация (игнорируйте вещи, связанные с почтовым индексом - это то, что в конечном итоге и должен делать класс, но сейчас я просто пытаюсь вернуть некоторые координаты из CoreLocation):
#import "CLZipCodeFetcher.h"
@implementation CLZipCodeFetcher
@synthesize delegate, locationManager;
- (id) init {
self = [super init];
if (self != nil) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.distanceFilter = 10.0f; // we don't need to be any more accurate than 10m
self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
self.locationManager.purpose = @"Retrieve zip code";
}
return self;
}
- (void)getZipCode {
[self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"Received location");
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"Location failed");
}
@end
И затем я инициализирую экземпляр класса в моем контроллере представления и вызываю метод:
CLZipCodeFetcher *zipCodeFetcher = [[CLZipCodeFetcher alloc] init];
[zipCodeFetcher getZipCode];
Теперь, когда я запускаю это, приложение занимает некоторое времязагрузить, а затем всплывает диалоговое окно с предупреждением, запрашивающее разрешение на использование приложением служб определения местоположения.Однако, как только он появляется, он немедленно исчезает (слишком быстро, чтобы позволить мне нажать кнопку разрешения или отказа), и ничего не происходит (методы делегата не вызываются).Если я затем захожу в настройки местоположения устройства, оно действительно показывает «Выкл» для моего приложения.Когда я включаю его вручную с этого экрана и затем снова пытаюсь попробовать приложение, диалоговое окно с предупреждением не появляется, но все равно ничего не происходит.Ни одно из моих сообщений отладки не зарегистрировано.Поведение на симуляторе и на моем iPhone 4 одинаково.
Так что, в принципе, у кого-нибудь есть идеи, почему?Я просмотрел все подобные потоки, и многие проблемы были связаны с управлением памятью, но я не думаю, что это будет проблемой, поскольку ARC должен управлять моим объектом CLLocationManager, верно?
PSКроме того, я добавил инфраструктуру CoreLocation в свой проект и не получаю ошибок или предупреждений в коде, но нужно ли что-то еще сделать перед использованием CoreLocation в моем приложении?