2009-09-04 13 views
7

Anche se è relativamente semplice determinare se un iPhone è su Wifi o una rete dati programmaticamente nella tua applicazione, non riesco a capire un modo per determinare se l'iPhone è su Edge o 3G.Come determinare se l'utente è su Edge o 3G su iPhone

Qualcuno trova un modo per determinare questo?

Nota: non preoccuparsi delle politiche di accettazione di Apple AppStore, quindi non mi interessa fare qualcosa di hacky nella mia app. (Gli iPhone non dovrebbero essere jailbroken)

+1

Sto anche cercando la risposta a questa domanda. Se sei in grado di trovare una soluzione, postala qui. Grazie! –

risposta

4

L'iPhone non fornisce questo tipo di informazioni agli sviluppatori a livello di programmazione. Il meglio che si possa sperare è determinare se una connessione ad un dato host debba essere instradata su una rete cellulare - vedere il riferimento SCNetworkReachability e il progetto Reachability per ulteriori informazioni.

1

Supponendo che la risposta di Tim sia corretta, un modo per capire se l'utente è su 3G o edge è possibile testare la velocità della connessione avviando un timer con l'app scaricare alcuni file dal web e calcolare il velocità, dovresti essere in grado di dire se sono su 3G o Edge in base alla diffrenza di velocità.

+1

Questo non è sempre affidabile: una connessione 3G molto scarsa può avere lo stesso tipo di velocità di una grande connessione EDGE. Sarebbe più una supposizione di qualsiasi altra cosa. Inoltre, ci sono altri indicatori oltre alla velocità; un'altra grande differenza tra le connessioni è il tempo del primo pacchetto di risposta (EDGE tende a vincere qui). – Tim

+1

Ma il vantaggio di congetture basate su misurate, è che anche se pensi di essere su Edge ma realmente su 3G - probabilmente stai andando a fare la cosa giusta usando un trasferimento di larghezza di banda inferiore se la velocità della connessione 3G è lenta come Edge sarebbe stato. –

-3

un modo è possibile rilevare iPhone 2G di sicuro è quello di guardare il nome del dispositivo, come riportato dal sistema operativo

#import <sys/utsname.h> 
+ (NSString *)deviceType { 
    struct utsname u; 
    uname(&u); 
    NSString *returnValue = [NSString stringWithFormat:@"%s", u.machine]; 

    return returnValue; 
} 

il valore di ritorno che si sta cercando è "iPhone1,1" per indicato iPhone 2G. combinare questo con il progetto raggiungibilità di dire quando sono su una rete cellulare e ti devi 1 avenue per garantire che essi sono su una connessione di bordo

+1

3G non significa "iPhone 3G" in questo caso – Manni

+0

non era destinato a significare iPhone 3G. guarda la dichiarazione. "Garantire che siano all'avanguardia con iPhone 2G" non dice nulla su iPhone 3G. – scootklein

0

Prova a controllare dalla barra di stato:

UIApplication *app = [UIApplication sharedApplication]; 
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; 
NSNumber *dataNetworkItemView = nil; 

for (id subview in subviews) { 
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { 
     dataNetworkItemView = subview; 
     break; 
    } 
} 
int connectivity; 
connectivity = [dataNetworkItemView valueForKey:@"dataNetworkType"]; 

E le chiavi di valore che ho trovato finora:

0 = No wifi or cellular 

1 = 2G and earlier? (not confirmed) 

2 = 3G? (not yet confirmed) 

3 = 4G 

4 = LTE 

5 = Wifi 
Problemi correlati