2015-09-21 5 views
2

Мне нужна помощь, пытаясь разобраться в этом сбое.Crash on CLConnection :: sendMessageInternal

У меня есть общий сбой (# 1 авария, ~ 300 устройств, пострадавших), что, кажется, происходит, когда мое приложение проверяет статус авторизации CLLocation:

enter image description here

Метод «старт» выглядит следующим образом:

-(BOOL)start { 
    if ([self isDenied]) { 
     return NO; 
    } else { 
     _manager = [[CLLocationManager alloc] init]; 
     _manager.delegate = self; 

     if ([_manager respondsToSelector:@selector(requestAlwaysAuthorization)] && [self isNotDetermined]) { 
      [_manager requestAlwaysAuthorization]; 
     } else { 
      [self startUpdatingLocation]; 
     } 
     return YES; 
    } 
} 

«isNotDetermined» метод, из которого приложение кажется, чтобы переключиться на другой поток и аварии, является:

- (BOOL)isNotDetermined { 
    return CLLocationManager.authorizationStatus == kCLAuthorizationStatusNotDetermined; 
} 

Возможно, также применим метод isDenied; в соответствии с документацией, то CLLocationManager не должна быть создана, если статус авторизации запрещен или ограничен:

- (BOOL)isDenied { 
    return CLLocationManager.authorizationStatus == kCLAuthorizationStatusDenied; 
} 

Может быть, что сбой приложения, потому что я создаю CLLocationManager в то время как authorizationStatus является ограниченным? Я ожидаю, что в этом случае произойдет сбой в методе init CLLocationManager.

+0

Я получаю эту проблему в своем приложении, и поскольку iOS v9x эта авария значительно возрастает. Можете ли вы предложить решение этой проблемы? – user2955351

ответ

1

Нам/нам удалось найти проблему. Проблема была двоякой:

  1. stopUpdatingLocation не вызывается, когда приложение заходило в фоновый режим.
  2. Когда приложение вышло на передний план, CLLocationManager был повторно инициализирован без предварительной остановки старого экземпляра. Два бита кода:
// called in both didFinishLaunching and applicationWillEnterForeground 
-(void) start { 
    _manager = [[CLLocationManager alloc] init]; 
    // other setup code 
} 

// Called in applicationDidEnterBackground 
-(void)stop { 
    // this variable was never false 
    if (_updateBackgroundLocations) { 
    [_manager stopUpdatingLocation]; 
    } 
} 

Что я сделал, чтобы это исправить:

-(void) start { 
    if (_manager == nil) { 
    _manager = [[CLLocationManager alloc] init]; 
    } 
    // other setup code 
} 

-(void)stop { 
    [_manager stopUpdatingLocation]; 
} 

Этот фиксированный ... несколько тысяч аварий. Вероятно, они произошли, когда приложение уже было в фоновом режиме, так как мы никогда не получали жалобы на часто возникающие сбои у наших пользователей.

+0

Я вижу эти же аварии, но я считаю, что я уже делаю то, что вы описали выше. Мой CLLocationManager создается только один раз в файле didFinishLaunchingWithOptions, я запускаю stopUpdatingLocations в willEnterBackground, и я запускаю startUpdatingLocations в applicationWillEnterForeground. Есть ли что-нибудь еще, что вы можете порекомендовать? – Alex