#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 перед ними.