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

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

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

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

Спасибо.

UPDATE: Я выполнил приложение в 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, поэтому вы должны удалить их из заголовка префикса, когда это будет сделано.

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

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 считает, что эти методы устарели и вызывают предупреждения.