2016-04-07 1 views
8

Mon application (c'est une application app store) est capable de se connecter via 3G/4G/LTE/Edge etc ... mais elle ne peut pas détecter en temps réel (via un rappel peut-être) que la force du signal a été modifiée. Par exemple: Si je suis connecté avec 4G et que je suis dans le "coin" où le signal est EDGE ou 2G je voudrais désactiver certaines fonctionnalités. Aussi, je voudrais réactiver la fonctionnalité avec le signal à nouveau 4G.Comment détecter en temps réel l'augmentation/diminution de la puissance du signal cellulaire dans iOS

J'ai vu la classe CTTelephonyNetworkInfo et aussi ces valeurs sont proposées dans le 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); 

mais comment l'application peut recevoir une notification si l'une de ces valeurs sont actives. J'ai un code qui lit à partir du CTTelephoneNetworkInfo et les valeurs que je reprends sont correctes, cependant ceci est fait quand j'appelle les méthodes manuellement.

+2

S'il vous plaît indiquer dans votre question si l'application que vous travaillez est pour le magasin Apple ou application d'entreprise. La solution pour chacun pourrait être différente. – OhadM

+0

Vous pouvez consulter http://stackoverflow.com/a/4955390/4557505 ou http://stackoverflow.com/a/14584397/4557505, il peut aider – HardikDG

Répondre

5

Pour détecter la puissance du signal cellulaire, j'utilise CTRadioAccessTechnologyDidChangeNotification.

Vous pouvez essayer ce code:

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") 
    } 
} 

Je l'ai testé sur mon iphone en activant/désactiver le mode avion et je l'ai remarqué que je dois parfois attendre un peu plus de temps pour la notification. Alors peut-être le meilleur moyen dans votre cas sera appelé info.currentRadioAccessTechnology et obtenir le résultat quand vous en avez besoin. Bien sûr, n'oubliez pas d'enlever l'observateur lorsque vous n'en avez plus besoin.

documentation Apple à ce sujet:

currentRadioAccessTechnology Discussion: La technologie actuelle d'accès radio, le dispositif est inscrit. Peut être NULL si l'appareil n'est enregistré sur aucun réseau.

De plus, je fais quelques recherches et j'ai trouvé un answer intéressant qui pourrait vous aider.

Simple Version 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); 
}];