Tworzenie aplikacji dla wielu wersji iOS

[[0]} testuję aplikację na iPhonie 4 z iOS 5.1 i iPadzie 4 z iOS 6.0. Rozejrzałem się i o dziwo nie znalazłem podobnych pytań:

1-Moja aplikacja ma kilka metod, które zostały przestarzałe w iOS 6.0, więc uważam, że muszę zbudować kilka warunków if / then, aby przetestować wersję systemu za pomocą: [[UIDevice currentDevice] systemVersion], a następnie użyć odpowiednich metod wersji. Czy to najskuteczniejszy sposób?

2-moim zdaniem, mając tylko jeden cel, cel wdrożenia "projekt" i cel wdrożenia" cele " służą temu samemu celowi. I muszę mieć jeden z nich lub oba jako iOS 5.1, ponieważ jest to minimalny obsługiwany system iOS. Co jest mylące, jeśli cel jest zbudowany w oparciu o iOS 5.1, jak to działa na iPad4 z iOS 6.0:

  • Czy system operacyjny iPad sprawdza wersje docelowe przed uruchomieniem lub po prostu próbuje uruchomić kod i zdarza się, że cel iOS 5.1 nie ma żadnego kodu, który jest niezgodny z 6.0 z?

  • Nawet jeśli tak jest, to w jaki sposób cel 5.1 mógłby wspierać metody 6.0, które zbudowałem, aby warunkowo zastąpić przestarzałe metody?

Wielkie dzięki!

Author: Spectravideo328, 2012-11-16

5 answers

Przestarzałe metody

Przestarzałe metody mogą być używane, jeśli targetujesz wersje systemu iOS, które zostały wydane przed te metody były przestarzałe. Ale zakładając, że cel wdrożenia jest ustawiony poprawnie, nie pojawią się żadne błędy kompilatora, chyba że te przestarzałe metody były zawsze przestarzałe dla wersji, które chcesz ustawić. Innymi słowy, jeśli w kodzie są wyświetlane ostrzeżenia o dezaktualizacji, należy je naprawić lub sprawdzić, czy ustawienie docelowe wdrożenia jest zgadza się. Nie ignoruj ich!

Xcode ustawianie poziomów

Wspominasz o tym, że możesz zdefiniować ustawienie celu wdrożenia zarówno na poziomie docelowym, jak i na poziomie projektu. Ustawienia kompilacji Xcode na poziomie docelowym nadpiszą ustawienia projektu. Zdefiniuj cel wdrożenia tylko na jednym z tych poziomów, a następnie przejdź do drugiego i naciśnij Usuń, aby nie mieć zduplikowanych wartości. Jeśli masz tylko jeden cel, to tak naprawdę nie ma znaczenia, czy zdefiniujesz go w celu lub projekcie poziom.

Kompatybilność wstecz i do przodu

Wreszcie, istnieje wiele czynników, które wchodzą w grę dla kompatybilności Wstecz i do przodu. Czasami pojawią się nowe metody iOS 6, takie jak supportedInterfaceOrientations, które będą po prostu ignorowane w starszych wersjach iOS. W innych przypadkach należy dodać jawne kontrole:

  • Jeśli wywołujesz metodę na obiekcie i ta metoda została wprowadzona tylko w systemie iOS 6, musisz dodać respondsToSelector:, Jak to:

    // only available on iOS 6
    if ([locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) {
        locationManager.pausesLocationUpdatesAutomatically = YES;
    }
    
  • Jeśli chcesz sprawdzić, czy dana klasa istnieje w bieżącej wersji iOS, możesz sprawdzić wartość zwracaną metody + class w następujący sposób:

    // Only available on iOS 6
    if ([UICollectionView class]) {
        // ...
    } else {
        // class doesn't exist in this iOS version
    }
    
  • Jeśli chcesz sprawdzić, czy dana funkcja jest dostępna, wykonaj proste polecenie if na niej:

    // Only available in iOS 6
    if (ABAddressBookCreateWithOptions) {
        ABAddressBookCreateWithOptions(...);
    } else {
        ABAddressBookCreate(...);
    }
    
  • Na koniec, jeśli chcesz sprawdzić, czy stała jest dostępna, sprawdź jej adres:

    // Only available in iOS 4
    if (&UIApplicationProtectedDataDidBecomeAvailable) {
        // subscribe to notification
    }
    

Podstawowe ustawienie SDK powinno być zawsze ustawione na "najnowsze".

Jeśli zastosujesz się do tych wytycznych, będziesz w stanie rozwiązać większość problemów bez konieczności dodawania jawnych sprawdzeń wersji. Sprawdzanie wersji iOS lub identyfikatora urządzenia jest bardzo kruche i może spowodować pęknięcie aplikacji w przyszłych wersjach. Naprawdę chcesz tego uniknąć.

 28
Author: Mike Weller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 17:06:10
  1. Możesz użyć [[UIDevice currentDevice] systemVersion] do wykrycia wersji systemu operacyjnego, która by zadziałała. Zamiast wykrywać wersję systemu operacyjnego, możesz użyć respondsToSelector:, aby zobaczyć, jakie metody są obecne, NSClassFromString() != nil, aby sprawdzić, czy są obecne klasy, i awaryjnego, jeśli ta metoda nie jest dostępna.

  2. IOS jest wstecznie kompatybilny, więc iOS 6 będzie uruchamiać aplikacje iOS 5 dobrze. Jeśli jednak chcesz używać specyficznej funkcji systemu iOS 6, ale nadal obsługuje system iOS 5.1, musisz:]}

    • skompilować przy użyciu SDK 6.0 tak, aby Kompilatory znają nowe Api
    • Ustaw wersję docelową na najniższą obsługiwaną, aka. 5.1. Każdy system wyższy od tej liczby uruchomi kod. Żaden niższy nie spróbuje.
    • Użyj jednej z metod opisanych w 1. aby upewnić się, że każde urządzenie wykonuje kody obsługi systemu operacyjnego.

Mam nadzieję, że to jasne, nie wahaj się, jeśli masz więcej pytań

 4
Author: Olotiar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 17:23:51

To, co musisz zrobić, to wykryć funkcjonalność, a nie wersję iOS, sprawdź ten wątek:

Warunkowa obsługa funkcji iOS 6 w aplikacji iOS 5

 2
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:14:33

Nie powinieneś sprawdzać wersji systemu, ale raczej sprawdzać funkcjonalności, z których próbujesz korzystać. Pamiętaj, że przestarzałe nie oznacza usunięte, więc cokolwiek próbujesz zrobić, może bardzo dobrze być tam dla iOS6. Aby sprawdzić konkretną funkcjonalność, należy zrobić coś w stylu:

if([TheClassInQuestion class] != nil)
{
    //use it
}
 0
Author: rooster117,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 16:48:46

IOS jest kompatybilny wstecz. Jeśli skompilujesz aplikację dla iOS 5.1, będzie ona również doskonale działać na iOS 6. Nie ma potrzeby ponownego implementowania przestarzałych klas.

Ale jeśli zmienisz wersję wdrożenia z 5.0 NA 6.0, Xcode wyświetli ostrzeżenia, jeśli używasz przestarzałych metod

Jeśli chcesz używać metod, które są dostępne tylko w iOS 6, możesz użyć tego wyboru:

if ([self respondsToSelector:@selector(doSomething:)]) {
        [self doSomething];
    }
 0
Author: Oleg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 16:53:54