3

У меня есть сценарий в одном из моих приложений, который я должен разрешить пользователю синхронизировать некоторые данные с сервером, только если соединение не менее 4G or LTE. Ниже приведен исходный код, который я использую, и он работает нормально до тех пор, пока сценарий объясняется ниже.CTTelephonyNetworkInfo currentRadioAccessTechnology Неоднозначный ответ

if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { 
       self.currentCellularDataConnectionType = kGPRS; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { 
       self.currentCellularDataConnectionType = kWCDMA; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { 
       self.currentCellularDataConnectionType = kEDGE; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { 
       self.currentCellularDataConnectionType = kLTE; 
       self.cellularConnectionFast = YES; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { 
       self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { 
       self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k4G]; 
       self.cellularConnectionFast = YES; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { 
       self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k3G]; 
       self.cellularConnectionFast = NO; 
      } 
      else { 
       self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology; 
       self.cellularConnectionFast = NO; 
      } 

currentCellularDataConnectionType поддерживает современную технологию радиодоступа и cellularConnectFast свойство определяет, является ли соединение достаточно быстро.

Проблема возникает в следующем сценарии

Если пользователь помещает iPad в спящий режим, нажав кнопку режима сна/питания уведомление CTRadioAccessTechnologyDidChangeNotification иногда дает «currentRadioAccessTechnology» значение свойства как NULL or NIL. И мы не получим второе уведомление с правильным типом подключения данных (RadioAccessTechnology) после этого. Поэтому я не могу установить значение свойства «» в этом состоянии.

Я пытался реализовать логику, чтобы установить значение «currentCellularDataConnectionType» и имущество «cellularConnectionFast» только если значение CTTelephonyNetworkInfo.currentRadioAccessTechnology не NULL или NIL, как указано ниже,

if ((NSNull *)currentCellularAccessTechnology == [NSNull null] || currentCellularAccessTechnology == nil) { 
      DDLogInfo(@"From %s, New Cellular Connection Type recieved as: %@, so sticking with the previous Cellular Connection Type: %@",__PRETTY_FUNCTION__,currentCellularAccessTechnology,self.currentCellularDataConnectionType); 
     } 
     else { 
      if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { 
       self.currentCellularDataConnectionType = kGPRS; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { 
       self.currentCellularDataConnectionType = kWCDMA; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { 
       self.currentCellularDataConnectionType = kEDGE; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { 
       self.currentCellularDataConnectionType = kLTE; 
       self.cellularConnectionFast = YES; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { 
       self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology; 
       self.cellularConnectionFast = NO; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { 
       self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k4G]; 
       self.cellularConnectionFast = YES; 
      } 
      else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] || 
        [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { 
       self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k3G]; 
       self.cellularConnectionFast = NO; 
      } 
      else { 
       self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology; 
       self.cellularConnectionFast = NO; 
      } 

Однако я видел комментарий в сообщение Raywenderlich, что есть вероятность, что CTTelephonyNetworkInfo.currentRadioAccessTechnology может вернуть 'nil', когда устройство не подключено к радиовыходу.

Какова реализация, которую я могу сделать в этом сценарии? Я использую класс достижимости для идентификации текущего типа сети (Нет соединения, WiFi или WWAN) и произведите вычисление значения «currentRadioAccessTechnology», только если WWAN.

+1

Вы нашли решение вашей проблемы? У меня есть аналогичная проблема: когда я помещаю приложение в фоновом режиме и переднем плане, 'currentRadioAccessTechnology' существующего экземпляра всегда возвращает' nil'. – fabb

ответ

1

Я думаю, что вы получаете экземпляр CTTelephonyNetworkInfo, а затем набрав currentRadioAccessTechnology (это то, что я делаю).

Проблема возникает именно так, как вы указывали, когда устройство спит. Экземпляр CTTelephoneNetworkInfo продолжает работать, пока ваше приложение работает в фоновом режиме, но как только вы идете неактивно; он становится недействительным.

Вам необходимо получить свежий экземпляр CTTelephoneNetworkInfo, когда вы снова начнете действовать (ответить на уведомления UIApplicationWillBecomeActive).

Как вы указали, currentRadioAccessTechnology возвращает null, когда вы не подключены к радиовыходу, но тогда достижимость не будет возвращать сотовый, поэтому вы должны быть в порядке.

В качестве бесплатного бонуса значение, возвращаемое currentRadioAccessTechnology, является строкой, поэтому вы можете очистить все эти операторы if.

Настройка справочных таблиц в депеше один раз блок

NSSet<NSString*> fastTechs = [[NSSet alloc] initWithObjects: CTRadioAccessTechnologyHSDPA, CTRadioAccessTechnologyHSDPD, CTRadioAccessTechnologyLTE, nil]; 

NSDictionary<NSString*,NSNumber> accessTechTypes = @{ CTRadioAccessTechnologyHSDPA :k4g, CTRadioAccessTechnologyLTE : kLTE}; 

Тогда ваш обычный код выглядит следующим образом:

CTRadioAcessTechnology accessTech = telephonyInfo.currentRadioAccessTechnology; 
self.cellularConnectionFast = [fastTechs contains:accessTech]; 

И

self.currentCellularDataConnectionType = accessTechTypes[accessTech] 
Смежные вопросы