Макросы препроцессора для конкретной версии - PullRequest
4 голосов
/ 24 октября 2011

У меня есть команда препроцессора для определения версии iOS и поддержки iCloud или нет.Что меня интересует, так это если макрос вроде:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000
    //stuff
#endif

сработает, если кто-то с iOS 4.x загрузит приложение из магазина приложений, но оно было скомпилировано в / для iOS 5.x.

Поскольку это будет оцениваться во время компиляции, приложения компилируются на устройстве или как это работает?Есть ли лучший способ для того же результата?

1 Ответ

7 голосов
/ 24 октября 2011

Вы не можете использовать макросы для этого. Макросы оцениваются во время компиляции, а не во время выполнения, что и требуется для обнаружения функций / возможностей, таких как поддержка iCloud. (В противном случае вы в конечном итоге включите его, поскольку вы компилируете для iOS 5 SDK во всех случаях)

Вам нужно просто проверить наличие методов повсеместности, которые сообщают вам, можете ли вы их вызвать, и сообщают, поддерживается ли iCloud, например ::

.
if ([[NSFileManager defaultManager] respondsToSelector:@selector(isUbiquitousItemAtURL:)])    
{
    // call it and do other iCloud stuff
}

Краткое замечание по поводу вашего вопроса о компиляции. Компиляция - это процесс, который превращает ваш реальный код в двоичный файл, который запускается на устройстве. Это происходит, когда вы делаете Build in Xcode, и это происходит только на вашей машине, но не в Apple или на устройстве. Вот почему проверки во время компиляции для номеров версий не будут работать - к тому времени, как вы отправите его на устройство, решение уже будет принято.

...