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