2016-04-07 24 views
8

La mia app (è un'app store app) è in grado di connettersi tramite 3G/4G/LTE/Edge ecc ... tuttavia non può rilevare in tempo reale (tramite un callback forse) che la forza del segnale è stata modificata. Ad esempio: se sono connesso con 4G e sono nell'angolo in cui il segnale è EDGE o 2G, desidero disabilitare alcune funzionalità. Inoltre vorrei riattivare la funzionalità con il segnale diventa nuovamente 4G.Come rilevare in tempo reale l'aumento/diminuzione della potenza del segnale cellulare in iOS

ho visto la classe CTTelephonyNetworkInfo e anche quei valori a cui l'SDK

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 

ma come l'applicazione riceve una notifica se uno di questi valori sono attivi. Ho un codice che legge dal CTTelephoneNetworkInfo e i valori che sto riprendendo sono corretti, tuttavia questo è fatto quando sto chiamando i metodi manualmente.

+2

Si prega di indicare nella sua domanda, se l'applicazione che si sta lavorando è per il negozio Apple o enterprise app. La soluzione per ciascuno potrebbe essere diversa. – OhadM

+0

Puoi controllare http://stackoverflow.com/a/4955390/4557505 o http://stackoverflow.com/a/14584397/4557505, può essere d'aiuto – HardikDG

risposta

5

Per rilevare l'energia del segnale cellulare, utilizzo CTRadioAccessTechnologyDidChangeNotification.

Si può provare questo codice:

import CoreTelephony 

private var info: CTTelephonyNetworkInfo! 

func createObserver() { 
    self.info = CTTelephonyNetworkInfo(); 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "currentAccessTechnologyDidChange", 
      name: CTRadioAccessTechnologyDidChangeNotification, object: self.observerObject) 
} 

func currentAccessTechnologyDidChange() { 
    if let currentAccess = self.info.currentRadioAccessTechnology { 
     switch currentAccess { 
     case CTRadioAccessTechnologyGPRS: 
      print("GPRS") 
     case CTRadioAccessTechnologyEdge: 
      print("EDGE") 
     case CTRadioAccessTechnologyWCDMA: 
      print("WCDMA") 
     case CTRadioAccessTechnologyHSDPA: 
      print("HSDPA") 
     case CTRadioAccessTechnologyHSUPA: 
      print("HSUPA") 
     case CTRadioAccessTechnologyCDMA1x: 
      print("CDMA1x") 
     case CTRadioAccessTechnologyCDMAEVDORev0: 
      print("CDMAEVDORev0") 
     case CTRadioAccessTechnologyCDMAEVDORevA: 
      print("CDMAEVDORevA") 
     case CTRadioAccessTechnologyCDMAEVDORevB: 
      print("CDMAEVDORevB") 
     case CTRadioAccessTechnologyeHRPD: 
      print("HRPD") 
     case CTRadioAccessTechnologyLTE: 
      print("LTE") 
     default: 
      print("DEF") 
     } 
    } else { 
     print("Current Access technology is NIL") 
    } 
} 

ho provato sul mio iPhone per accendere/spegnere la modalità aereo e ho notato che a volte devo aspettare un po 'più di tempo per la notifica. Quindi forse il modo migliore nel tuo caso sarà chiamato semplicemente info.currentRadioAccessTechnology e otterrai il risultato quando ne hai bisogno. Certo, ricorda di rimuovere l'osservatore quando non ne hai più bisogno.

documentazione di Apple su questo:

currentRadioAccessTechnology Discussione: L'attuale tecnologia di accesso radio il dispositivo è registrato. Può essere NULL se il dispositivo non è registrato su nessuna rete.

Additionaly, faccio qualche ricerca e ho trovato un interessante answer che potrebbe aiutarti.

semplice versione Obj-C:

#import <CoreTelephony/CTTelephonyNetworkInfo.h> 


CTTelephonyNetworkInfo *ctInfo = [CTTelephonyNetworkInfo new]; 
[[NSNotificationCenter defaultCenter] addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
    NSLog(@"current access radio access did change to : %@", ctInfo.currentRadioAccessTechnology); 
}];