2010-10-05 23 views
45

To jest kontynuacja mojego ostatniego pytania. Używam beginAnimations:context: do ustawienia bloku animacji do animowania niektórych etykiet UITextLabels. Zauważyłem jednak, że w dokumentach jest napisane: "Używanie tej metody jest odradzane w iOS 4.0 i późniejszych wersjach. Zamiast tego należy używać metod animacji blokowych."Sprawdź wersję systemu iOS w środowisku wykonawczym?

Moje pytanie brzmi: chciałbym użyć animacjiWithDuration: animacje: (dostępne w iOS 4.0 i późniejszych wersjach), ale nie chcę wykluczać ludzi korzystających z iOS 3.0. Czy istnieje sposób sprawdzania wersji urządzenia na urządzeniu z iOS w środowisku wykonawczym, aby móc podjąć decyzję, która instrukcja ma być używana?

+1

Sprawdź ten http://stackoverflow.com/questions/3339722/check-iphone-ios-version wątek. –

Odpowiedz

51

w wielu przypadkach nie trzeba sprawdzić wersję iOS bezpośrednio, zamiast z tego możesz sprawdzić, czy konkretna metoda jest obecna w środowisku wykonawczym, czy nie.

W twoim przypadku można wykonać następujące czynności:

if ([[UIView class] respondsToSelector:@selector(animateWithDuration:animations:)]){ 
// animate using blocks 
} 
else { 
// animate the "old way" 
} 
+1

'[[klasa UIView] replysToSelector: @selector (animateWithDuration: animations :)]' może być napisane jako '[UIView respondsToSelector: @selector (animateWithDuration: animations :)]' – user102008

+10

Nienawidzę ogólnych wypowiedzi. Istnieją przypadki użycia, w których należy sprawdzić wersję systemu iOS. Mam teraz do czynienia z takim przypadkiem użycia !!! –

+0

@JohnConnor, masz rację, w niektórych przypadkach możesz potrzebować sprawdzić wersję iOS, ale ogólnie powinieneś tego unikać, jeśli to możliwe. Po prostu ciekawy, jaki jest twój przypadek? – Vladimir

19

celu dostosowania do wersji podanej w systemie określa

// #define __IPHONE_2_0 20000
// #define __IPHONE_2_1 20100
// #define __IPHONE_2_2 20200
// #define __IPHONE_3_0 30000
// #define __IPHONE_3_1 30100
// #define __IPHONE_3_2 30200
// #define __IPHONE_4_0 40000
można napisać funkcję takiego (ty sh ould prawdopodobnie przechowywać tę wersję gdzieś zamiast obliczać go za każdym razem):

+ (NSInteger) getSystemVersionAsAnInteger{ 
    int index = 0; 
    NSInteger version = 0; 

    NSArray* digits = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; 
    NSEnumerator* enumer = [digits objectEnumerator]; 
    NSString* number; 
    while (number = [enumer nextObject]) { 
     if (index>2) { 
      break; 
     } 
     NSInteger multipler = powf(100, 2-index); 
     version += [number intValue]*multipler; 
     index++; 
    } 
return version; 
} 

Następnie można użyć to w następujący sposób:

if([Toolbox getSystemVersionAsAnInteger] >= __IPHONE_4_0) 
{ 
    //blocks 
} else 
{ 
    //oldstyle 
} 
6

Zniechęcony nie jest taka sama jak przestarzała.

Jeśli potrzebujesz obsługi starszych wersji iOS, które nie mają metod opartych na blokach, nie ma nic złego w korzystaniu ze starszych metod (o ile oczywiście nie zostały one usunięte).

+0

To bardzo dobry punkt, bardzo doceniany. – fuzzygoat

+0

Szczerze mówiąc, jeśli nie potrzebujesz funkcji metod opartych na blokach, nie widzę niczego złego w starszej metodzie. – Jonny

+0

Proszę zasugerować, aby to zrobić w komentarzu lub w celu dodania użytecznych informacji. Nie wiem, dlaczego jest przegłosowywany ... –

59

Prostsze rozwiązanie dla każdego, kto będzie potrzebować pomocy w przyszłości:

NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; 

if (5 == [[versionCompatibility objectAtIndex:0] intValue]) { /// iOS5 is installed 

    // Put iOS-5 code here 

} else { /// iOS4 is installed 

    // Put iOS-4 code here   

} 
+3

mógłbyś również użyć opcji porównania 'NSNumericSearch';) http://stackoverflow.com/a/1990854/429521 –

+0

To jest wspaniałe, ponieważ w przeciwieństwie do obecnie akceptowanej odpowiedzi muszę wiedzieć, który Wersja iOs działa, ponieważ niektóre znaki unicode działają inaczej pre iOS6 (jak/u200b, który ma długość 0 na periOS6, ale długość 1 na postiOS6) –

+3

Należy również zauważyć, że powinieneś powiedzieć 'if (5 < = ...) "w ten sposób, jeśli wyjdą z nowszą wersją iOs (np. iOS6), twoja aplikacja będzie nadal obsługiwać twoje funkcje! –

3

Dla moich celów Pisałem mały bibliotekę Abstracts dala zaistniałych połączeń C i prezentuje interfejs Objective-C.

GBDeviceDetails deviceDetails = [GBDeviceInfo deviceDetails]; 
if (deviceDetails.iOSVersion >= 6) { 
    NSLog(@"It's running at least iOS 6");  //It's running at least iOS 6 
} 

Oprócz coraz aktualną wersję iOS, ale również wykrywa sprzętowej urządzenia bazowego, i dostaje informacje o rozmiarze ekranu; wszystko w czasie wykonywania. Jest to na github: GBDeviceInfo. Licencjonowane w ramach Apache 2.

1

W MonoTouch:

Aby uzyskać wersji głównej zastosowanie:

UIDevice.CurrentDevice.SystemVersion.Split('.')[0] 

za drobne wersji użytku:

UIDevice.CurrentDevice.SystemVersion.Split('.')[1] 
1

Trochę ładniejszy i bardziej efektywne dostosowanie się do powyższych rozwiązań:

-(CGPoint)getOsVersion 
{ 
    static CGPoint rc = {-1,-1}; 
    if (rc.x == -1) { 
     NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; 
     rc.x = [versionCompatibility[0] intValue]; 
     rc.y = [versionCompatibility[1] intValue]; 
    } 
    return rc; 
} 

teraz można

if ([self getOsVersion].x < 7) { 
} 

HTH

+0

Ah, stare podejście CGPoint, co? – Nestor

6

Można używać wersji ramach Fundacji w celu określenia aktualnej wersji systemu.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){ 

//for earlier versions 

} else { 

//for iOS 7 

} 
2

umieścić to w swoim Prefix.pch pliku

#define IOS_VERSION [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] firstObject] intValue] 

A potem można sprawdzić wersje iOS, takich jak:

if(IOS_VERSION == 8) 
{ 
    // Hello 8! 
} 
else 
{ 
    // Hello some other version! 
} 

z kursu, jeśli można użyć funkcji wykrywania (i to sprawia, sens dla twojego przypadku użycia) powinieneś to zrobić.

6

Większość z tych rozwiązań jest tak przesadna. Wszystko, co musisz zrobić, to [[UIDevice currentDevice].systemVersion intValue]. Automatycznie usuwa dziesiętne, więc nie ma potrzeby dzielenia ciągu.

więc można po prostu sprawdzić to lubią:

if ([[UIDevice currentDevice].systemVersion intValue] >= 8) { 
    // iOS 8.0 and above 
} else { 
    // Anything less than iOS 8.0 
} 

Można również zdefiniować makro z tym kodem:

#define IOS_VERSION [[UIDevice currentDevice].systemVersion intValue]; 

lub nawet dołączyć czek:

#define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8) 

Następnie wystarczy wykonać:

if (IOS_8PLUS) { 
    // iOS 8.0 and above 
} else { 
    // Anything less than iOS 8.0 
} 
2

XCode 7 dodano składni available czyni to stosunkowo prosta:

SWIFT

if #available(iOS 9, *) { 
    // iOS 9 only code 
} 
else { 
    // Fallback on earlier versions 
} 

XCode 9 również dodać składni Celu-C

Cel C:

if (@available(iOS 9.0, *)) { 
    // iOS 9 only code 
} else { 
    // Fallback on earlier versions 
} 
Powiązane problemy