Разработка приложений для нескольких версий iOS

Я тестирую приложение на iPhone 4 с iOS 5.1 и iPad 4 с iOS 6.0. Я огляделся и на удивление не нашел похожих вопросов:

1-мое приложение имеет некоторые методы, которые были устаревшими в iOS 6.0, поэтому я считаю, что мне нужно создать некоторые условия if/then для тестирования версии системы с помощью: [[UIDevice currentDevice] systemVersion], а затем использовать соответствующие методы версии. Это самый эффективный способ?

2-мое понимание, только с одним цель, цель развертывания" проект "и цель развертывания" цели " служат одной и той же цели. И мне нужно иметь один из них или оба как iOS 5.1, так как это минимальная поддерживаемая iOS. Что сбивает с толку, так это то, что если цель построена на основе iOS 5.1, как она будет работать на iPad4 с iOS 6.0:

  • проверяет ли iPad OS целевые версии перед запуском или просто пытается запустить код, и случается, что цель iOS 5.1 не имеет никакого кода, который 6.0 несовместим с?

  • даже если это так, как может 5.1 target поддерживать методы 6.0, которые я построил для условной замены устаревших методов?

большое спасибо!

5 ответов


устаревшие методы

устаревшие методы могут использоваться, если вы нацелены на версии iOS, которые были выпущены до эти методы были устаревшими. Но если ваша цель развертывания установлена правильно, вы не получите ошибок компилятора, если эти устаревшие методы не были всегда устарел для версий, которые вы нацеливаете. Другими словами, если вы видите предупреждения в коде нужно исправить или проверить, что ваши настройка цели развертывания верна. Не игнорируйте их!

уровни настройки Xcode

вы упоминаете тот факт, что вы можете определить целевой параметр развертывания как на целевом уровне, так и на уровне проекта. Параметры сборки Xcode на целевом уровне переопределят параметры проекта. Поэтому определите цель развертывания только на одном из этих уровней, затем перейдите к другому и нажмите Удалить, чтобы у вас не было повторяющихся значений. Если у вас есть только одна цель, то это не имеет значения, если вы определите его на уровне цели или проекта.

назад и вперед совместимость

наконец, есть много факторов, которые вступают в игру для вперед и назад совместимости. Иногда будут новые методы iOS 6, такие как supportedInterfaceOrientations который будет просто игнорироваться в старых версиях iOS. В других случаях вам нужно добавить явные проверки:

  • если вы вызываете метод на объекте, и этот метод был введен только с iOS 6, Вы будете нужно добавить respondsToSelector: проверить такой:

    // only available on iOS 6
    if ([locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) {
        locationManager.pausesLocationUpdatesAutomatically = YES;
    }
    
  • если вы хотите проверить, существует ли определенный класс в текущей версии iOS, вы можете проверить возвращаемое значение метода + class следующим образом:

    // Only available on iOS 6
    if ([UICollectionView class]) {
        // ...
    } else {
        // class doesn't exist in this iOS version
    }
    
  • если вы хотите проверить, доступна ли конкретная функция, сделайте простой оператор if на нем:

    // Only available in iOS 6
    if (ABAddressBookCreateWithOptions) {
        ABAddressBookCreateWithOptions(...);
    } else {
        ABAddressBookCreate(...);
    }
    
  • наконец, если вы хотите проверить, доступна ли константа, проверьте ее адрес:

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

ваша базовая настройка SDK всегда должна быть установлена на "последний".

если вы будете следовать всем этим рекомендациям, вы сможете решить большинство ваших проблем без необходимости добавлять явные проверки версий. Проверка версии iOS или идентификатора устройства очень хрупкая и, вероятно, приведет к разрыву вашего приложения в будущих версиях. Ты действительно хочешь избежать этого.


  1. можно использовать [[UIDevice currentDevice] systemVersion] чтобы обнаружить версию ОС, это будет работать. Вместо обнаружения версии ОС вы можете использовать respondsToSelector: чтобы увидеть, какие методы присутствуют, NSClassFromString() != nil чтобы увидеть, присутствуют ли классы, и резервный, если этот метод недоступен.

  2. iOS обратно совместим, поэтому iOS 6 будет запускать приложения iOS 5 просто отлично. Однако, если вы хотите использовать определенную функцию iOS 6, но все еще поддерживаете iOS 5.1, вы должны :

    • компиляция с использованием SDK 6.0, чтобы компиляторы знали новые API
    • установить целевой вариант низкой поддержал, ака. 5.1. Любая система выше этого числа будет запускать код. Ни ниже не буду пробовать.
    • используйте один из методов, описанных в 1. чтобы убедиться, что каждое устройство выполняет коды поддержки ОС.

Я надеюсь, что это ясно, не стесняйтесь, если у вас есть вопросы


то, что вы должны сделать, это обнаружить функциональность, а не версию iOS, пожалуйста, проверьте эту тему:

условная поддержка функций iOS 6 в приложении iOS 5


вы не должны проверять версию системы, а скорее проверять функциональность, которую вы пытаетесь использовать. На этой ноте помните, что устаревший не означает удален, поэтому все, что вы пытаетесь сделать, может быть очень хорошо для iOS6. Чтобы проверить определенную функциональность, вы должны сделать что-то вроде:

if([TheClassInQuestion class] != nil)
{
    //use it
}

iOS обратно совместим. Если вы скомпилируете свое приложение для iOS 5.1, оно будет отлично работать и на iOS 6. Нет необходимости повторно реализовывать устаревшие классы.

но если вы измените версию развертывания с 5.0 на 6.0, Xcode покажет вам предупреждения, если вы используете устаревшие методы

Если вы хотите использовать методы, доступные только в iOS 6, Вы можете использовать эту проверку:

if ([self respondsToSelector:@selector(doSomething:)]) {
        [self doSomething];
    }