2009-09-04 9 views
7

Chociaż jest względnie proste ustalenie, czy iPhone jest w sieci WiFi lub sieci danych programowo w aplikacji, nie mogę wymyślić sposób ustalenia, czy iPhone jest na krawędzi lub 3G.Jak ustalić, czy użytkownik jest na Edge lub 3G na iPhonie?

Ktoś wymyślić sposób, aby to ustalić?

Uwaga: nie martwisz się o zasady akceptacji Apple AppStore, więc nie mam nic przeciwko zrobieniu czegoś hacky w mojej aplikacji. (IPhone nie powinien być jednak jailbreakowany)

+1

Poszukuję również odpowiedzi na to pytanie. Jeśli jesteś w stanie znaleźć rozwiązanie, opublikuj to tutaj. Dzięki! –

Odpowiedz

4

iPhone nie zapewnia programistycznie tego rodzaju informacji programistom. Najlepsze, na co możesz liczyć, to określić, czy połączenie z danym hostem będzie musiało być trasowane przez sieć komórkową - zobacz numer referencyjny SCNetworkReachability i projekt Reachability, aby uzyskać więcej informacji.

1

Zakładając, że odpowiedź Tima jest prawidłowa, jednym ze sposobów sprawdzenia, czy użytkownik jest w sieci 3G, czy też krawędź, jest możliwość przetestowania szybkości połączenia przez uruchomienie licznika czasu, w którym aplikacja pobiera plik z Internetu i oblicza prędkość, powinieneś być w stanie powiedzieć, czy są one na 3G lub Edge przez różnicę prędkości.

+1

Nie zawsze jest to niezawodne - bardzo słabe połączenie 3G może mieć ten sam rodzaj przepustowości co świetne połączenie EDGE. To byłaby większa zgadywanka niż cokolwiek innego. Ponadto oprócz prędkości istnieją inne wskaźniki; kolejną dużą różnicą między połączeniami jest czas na pierwszy pakiet odpowiedzi (EDGE ma tendencję do wygrywania tutaj). – Tim

+1

Ale zaletą zgadywania na podstawie zmierzonej wartości jest to, że nawet jeśli uważasz, że jesteś na Edge, ale naprawdę na 3G - prawdopodobnie będziesz robić to, co należy, używając transferu o niższej przepustowości, jeśli szybkość połączenia 3G jest tak wolna jak Edge byłby. –

-3

jeden sposób można wykryć iPhone 2G na pewno jest, aby spojrzeć na nazwy urządzenia, zgłoszone przez OS

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

    return returnValue; 
} 

wartość zwracana szukasz jest „iPhone1,1” do wskazanego iPhone 2G. połączyć to z projektu osiągalności powiedzieć, kiedy są one w sieci komórkowej, a ty masz 1 Avenue, aby zagwarantować, że są one na połączenie krawędzi

+1

3G nie oznacza, że ​​"iPhone 3G" w tym przypadku – Manni

+0

nie miało oznaczać iPhone'a 3G. spójrz na oświadczenie. "gwarantują, że są na krawędzi iPhone 2G" nie mówi nic na temat iPhone 3G. – scootklein

0

Spróbuj sprawdzić go na pasku stanu:

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"]; 

I klucze wartości, które znalazłem do tej pory:

0 = No wifi or cellular 

1 = 2G and earlier? (not confirmed) 

2 = 3G? (not yet confirmed) 

3 = 4G 

4 = LTE 

5 = Wifi 
Powiązane problemy