Приложение для iPhone, разработанное с SDK 4.2, требует обратной совместимости с iOS 3.1.3 .. простой способ?

#ios #backwards-compatibility

#iOS #обратная совместимость

Вопрос:

Я создал приложение для iPhone с SDK 4.2, однако я знаю, что также хочу сделать его совместимым с iOS 3.1.3.

Первым шагом было установить для цели развертывания значение 3.1.3. Он отлично работает на симуляторе 3.2, но приложение время от времени вылетает, поскольку я использую некоторые методы, которые недоступны в этом раннем SDK.

Итак, мой вопрос в том, есть ли прямой способ найти методы / классы-нарушители, которые я использую в своем проекте, которые недоступны в 3.1.3? (без ручного прохождения каждого вызова метода и консультации с документами для доступности SDK?)

Спасибо.

ОБНОВЛЕНИЕ: я выполнил приложение на 3.1.3 и попытался вручную протестировать каждый путь выполнения в надежде найти все исключения. Это было выполнено с некоторым успехом. Однако что, если приложение огромно? и есть много путей выполнения? Для этого сценария должен быть какой-то инструмент. Любые мысли приветствуются.

Ответ №1:

У меня была такая же проблема, и я только что нашел решение.

Вы должны добавить следующие определения в начале заголовка вашего префикса:

 #import <Availability.h>
#define __AVAILABILITY_INTERNAL__IPHONE_3_2 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_0 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_1 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_2 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_3 __AVAILABILITY_INTERNAL_DEPRECATED
  

Тогда при следующей компиляции приложения методы, недоступные в старых версиях (в данном случае iOS 3.1), будут помечены как устаревшие, и вы получите предупреждения для каждого из них.

Вы можете использовать __AVAILABILITY_INTERNAL_UNAVAILABLE вместо __AVAILABILITY_INTERNAL_DEPRECATED , если хотите получать ошибки.

Эти строки переопределяют фактические определения в AvailabilityInternal.h, поэтому вы должны удалить их из своего заголовка prefix, когда закончите.

Вот как это работает:

Apple отмечает доступность методов в заголовочных файлах такими макросами, как __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0) .

Поскольку вы компилируете для iOS, применяется следующее определение Availibility.h :

 #define __OSX_AVAILABLE_STARTING(_mac, _iphone) __AVAILABILITY_INTERNAL##_iphone
  

Таким образом, методы фактически помечены __AVAILABILITY_INTERNAL__IPHONE_4_0 и аналогичны макросам. Обычно при компиляции с новым SDK эти макросы заменяются на __AVAILABILITY_INTERNAL_WEAK_IMPORT , которые не выдают никаких предупреждений. Добавляя строки в начале моего ответа в заголовок вашего префикса, вы перезаписываете эти определения __AVAILABILITY_INTERNAL_DEPRECATED . Поэтому Xcode считает, что эти методы устарели, и выдает предупреждения.

Комментарии:

1. Спасибо за ответ. я получаю список переопределенных предупреждений, как вы сказали… App-Prefix.pch: 11: 1: предупреждение: «__ДОСТУПНОСТЬ _ВНУТРЕННЯЯ__IPHONE _4_3» переопределено.. Но это также говорит мне, какие методы устарели. Не могли бы вы объяснить, как это работает?

2. Я добавил объяснение к своему ответу.

3. спасибо за отличный ответ, проголосовал… но он не поймал [UIView animateWithDuration… __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_4_0) — есть идеи?

4. вероятно, это было связано с тем, что вы импортировали UIKit до этих определений. Я отредактировал ответ. Вы должны добавить определения в начало вашего файла префикса и убедиться, что вы импортируете доступность. h перед ними.