2015-09-03 3 views
2

У меня возникла проблема с обновленной информацией о вашем местоположении GPS. Функция, заданная мной «locationManager» при нажатии кнопки, не обновляет информацию в «Ярлыке».locationManager не работает на iOS 9

Мой код: http://pastebin.com/hWeq6gTS

Я начинающий программист IOS. Пожалуйста помоги.

+0

Включили ли вы службы местоположения в настройках проекта? – Michal

+0

Ваш метод действия - это средство работы, которое вы проверили, если он звонит или нет, это должен быть IBAction, если вы привязали его к раскадровке или xib. –

+0

Просто подумайте, что с момента выхода iOS8 была проблема с авторизацией местоположения, поэтому имейте это в виду. – SanitLee

ответ

6

вопрос, что не всегда очевидно, с услугами определения местоположения является то, что вы должны иметь один из этих двух ключей в вашем Info.plist:

  1. NSLocationWhenInUseUsageDescription
  2. NSLocationAlwaysUsageDescription

Тогда , при запуске обновления вашей позиции не забудьте сначала запросить разрешения (опять же, в зависимости от ваших требований (при использовании/всегда):

  1. [self.locationManager requestWhenInUseAuthorization]
  2. [self.locationManager requestAlwaysAuthorization]
+0

К сожалению, все еще не работает. http://i.imgur.com/z5JrWbE.png – Kejl

+0

@Update - у меня точка останова 3.1 на линии: [_locationManager requestWhenInUseAuthorization]; – Kejl

+0

У вас должно быть какое-то значение в виде строки, оно, вероятно, пытается вынуть строку из Info.plist, где у вас есть только параметр - NSLocationWhenInUseUsageDescription', но нет значения. – Michal

0

Иногда мы делаем проблему лица, когда мы не проверяем статус авторизации. Вы можете проверить этот код

 // Custom initialization code 
    CLLocationManager *manager = [[CLLocationManager alloc]init]; 
    manager.delegate = self; 
    manager.desiredAccuracy = kCLLocationAccuracyBest; 
    // Setting distance fiter to 10 to get notified only after location change about 10 meter 
    manager.distanceFilter = kCLDistanceFilterNone; 

    // Requesting for authorization 

    if ([manager respondsToSelector:@selector(requestWhenInUseAuthorization)]){ 
     [manager requestWhenInUseAuthorization]; 
    } 

    // Immediately starts updating the location 
    [manager startUpdatingLocation]; 
    [manager startUpdatingHeading]; 

если __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000

// user activated automatic attraction info mode 
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 
    if (status == kCLAuthorizationStatusDenied || 
     status == kCLAuthorizationStatusAuthorizedWhenInUse || 
     status == kCLAuthorizationStatusNotDetermined) { 
     // present an alert indicating location authorization required 
     // and offer to take the user to Settings for the app via 
     // UIApplication -openUrl: and UIApplicationOpenSettingsURLString 
     [manager requestAlwaysAuthorization]; 
    } 

    [manager requestWhenInUseAuthorization]; 

еще
[manager requestAlwaysAuthorization]; 

ENDIF
+0

Я использовал ваш код, чтобы запросить местоположение и запросить работу. Однако никаких координат обновления нет. – Kejl

+0

, где вы используете приложение? На симуляторе или на устройстве iOS? Получаете ли вы оповещение о проверке местоположения при запуске приложения? –

3

Вместо использования

-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation{ 
// Location update code 
} 

использовать эту функцию, чтобы получить обновление местоположения

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 
      // Assigning the last object as the current location of the device 
      CLLocation *currentLocation = [locations lastObject]; 

} 
+1

Зачем оставлять несколько ответов, если вы можете редактировать свой существующий? – Vig

+0

Спасибо Sauvik Dolui: Его работы для меня. – ekant

+0

Вы больше всего любите @ekant. :) –

4

Добавьте эти два свойства в info.plist

'NSLocationAlwaysUsageDescription' и ниже собственности

enter image description here

Создать 'LocationManager' CocoaTouch класс унаследовать от NSObject, например, ниже класса.

Синглтон местонахождения Менеджер Class .h

#import <Foundation/Foundation.h> 

@interface LocationManager : NSObject <CLLocationManagerDelegate> 
{ 
    CLLocationManager *locationManager; 
} 

@property (strong, nonatomic) NSString *longitude; 
@property (strong, nonatomic) NSString *latitude; 
@property (strong, nonatomic) CLLocation *currentLocation; 

+ (instancetype)sharedInstance; 

@end 

Реализация здесь .m

#import "LocationManager.h" 

@implementation LocationManager 

- (id) init 
{ 
    self = [super init]; 

    if (self != nil) 
    { 
     [self locationManager]; 
    } 
    return self; 
} 


+ (instancetype)sharedInstance 
{ 
    static LocationManager *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[LocationManager alloc] init]; 
     // Do any other initialisation stuff here 
    }); 
    return sharedInstance; 
} 

- (void) locationManager 
{ 
    if ([CLLocationManager locationServicesEnabled]) 
    { 
     locationManager = [[CLLocationManager alloc] init]; 
     locationManager.delegate = self; 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
     locationManager.distanceFilter = kCLDistanceFilterNone; 
     if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
     { 
      [locationManager requestWhenInUseAuthorization]; 
     } 
     [locationManager startUpdatingLocation]; 
    } 
    else{ 

     UIAlertView *servicesDisabledAlert = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled" message:@"You currently have all location services for this device disabled. If you proceed, you will be showing past informations. To enable, Settings->Location->location services->on" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:@"Continue",nil]; 
     [servicesDisabledAlert show]; 
     [servicesDisabledAlert setDelegate:self]; 
    } 
} 

- (void)requestWhenInUseAuthorization 
{ 
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 

    // If the status is denied or only granted for when in use, display an alert 
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusDenied) { 
     NSString *title; 
     title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" : @"Background location is not enabled"; 
     NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings"; 

     UIAlertView *alertViews = [[UIAlertView alloc] initWithTitle:title 
                  message:message 
                  delegate:self 
                cancelButtonTitle:@"Cancel" 
                otherButtonTitles:@"Settings", nil]; 
     [alertViews show]; 
    } 
    // The user has not enabled any location services. Request background authorization. 
    else if (status == kCLAuthorizationStatusNotDetermined) { 
     [locationManager requestWhenInUseAuthorization]; 
    } 
} 


#pragma mark - CLLocationManagerDelegate 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"didFailWithError: %@", error); 
    UIAlertView *errorAlert = [[UIAlertView alloc] 
           initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
// [errorAlert show]; 
} 

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 
{ 
    switch (status) { 
     case kCLAuthorizationStatusNotDetermined: 
     case kCLAuthorizationStatusRestricted: 
     case kCLAuthorizationStatusDenied: 
     { 
      // do some error handling 
     } 
      break; 
     default:{ 
      [locationManager startUpdatingLocation]; 
     } 
      break; 
    } 
} 

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

    CLLocation *location; 
    location = [manager location]; 
    CLLocationCoordinate2D coordinate = [location coordinate]; 
    _currentLocation = [[CLLocation alloc] init]; 
    _currentLocation = newLocation; 
    _longitude = [NSString stringWithFormat:@"%f",coordinate.longitude]; 
    _latitude = [NSString stringWithFormat:@"%f",coordinate.latitude]; 
    // globalObjects.longitude = [NSString stringWithFormat:@"%f",coordinate.longitude]; 
    // globalObjects.latitude = [NSString stringWithFormat:@"%f",coordinate.latitude]; 
} 


@end 

импорт

#import "LocationManager.h" 

в вашем AppDelegate.ч

и называют, что в ваших AppDelegate.m как этого

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [LocationManager sharedInstance]; 
    return true; 
} 

Тогда просто получить [LocationManager sharedInstance] .longitude или широты для уточненных лат долго.

Смежные вопросы