2016-04-07 4 views
8

Meine App (es ist eine App Store App) ist in der Lage, über 3G/4G/LTE/Edge usw. zu verbinden ... aber es kann nicht in Echtzeit erkennen (vielleicht über einen Rückruf), dass die Stärke des Signals verändert wurde. Zum Beispiel: Wenn ich mit 4G verbunden bin und ich bin in der "Ecke", wo das Signal EDGE oder 2G ist, möchte ich einige Funktionalität deaktivieren. Auch ich möchte die Funktionalität wieder aktivieren mit dem Signal wird wieder 4G.So erkennen Sie in Echtzeit die Erhöhung/Verringerung der zellulären Signalstärke in iOS

Ich habe die CTTelephonyNetworkInfo Klasse gesehen und auch diese Werte sind im SDK angeboten

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); 

aber wie kann die App eine Benachrichtigung, wenn einer dieser Werte erhalten aktiv sind. Ich habe einen Code, der von der CTTelephoneNetworkInfo liest und die Werte, die ich zurücknehme, sind korrekt, jedoch geschieht dies, wenn ich die Methoden manuell aufruft.

+2

Bitte in Ihrer Frage an, ob die App auf dem Sie arbeiten für den Apple Store oder Enterprise App ist. Die Lösung für jedes könnte anders sein. – OhadM

+0

Sie können http://StackOverflow.com/a/4955390/4557505 oder http://StackOverflow.com/A/14584397/4557505 überprüfen, es kann helfen – HardikDG

Antwort

5

Um zellulare Signalstärke zu erkennen, verwende ich CTRadioAccessTechnologyDidChangeNotification.

können Sie diesen Code versuchen:

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

Ich habe auf meinem iPhone getestet es von/aus Flugmodus einschalten und ich habe bemerkt, dass manchmal muss ich für die Benachrichtigung ein bisschen mehr Zeit warten. Also vielleicht wird der bessere Weg in Ihrem Fall nur info.currentRadioAccessTechnology genannt und das Ergebnis erhalten, wenn Sie es brauchen. Vergessen Sie natürlich nicht, den Beobachter zu entfernen, wenn Sie ihn nicht mehr benötigen.

Apple-Dokumentation dazu:

currentRadioAccessTechnology Diskussion: Die aktuelle Funkzugangstechnologie das Gerät registriert ist. Kann NULL sein, wenn das Gerät in keinem Netzwerk registriert ist.

Zusätzlich habe ich ein wenig Forschung und ich fand eine interessante answer, die Ihnen helfen könnte.

Einfache Obj-C-Version:

#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); 
}]; 
Verwandte Themen