Изящная деградация на iPhone - PullRequest
1 голос
/ 18 апреля 2010

Как мне написать программу для iPhone (Objective C ++), которая работает на OS 2.0, но использует возможности 3.0, если они доступны?

Пример: копировать и вставить (класс UIPasteboard). Хорошая функция, но я не хочу убивать обратную совместимость. Компилировать ли я в SDK v. 3 или v. 2? Если последнее, как мне создать экземпляр UIPasteboard, учитывая, что он не объявлен в заголовках? Если первое, не вызовет ли некоторые функции C-linkage «неразрешенную ссылку» при загрузке под OS 2.0?

Ответы [ 2 ]

1 голос
/ 18 апреля 2010

Отредактируйте настройки сборки вашей цели следующим образом:

  • Установите для базового SDK версию, API которой вы хотите использовать (например, 3.0 или 3.1).
  • Установите для цели развертывания самую низкую версию ОС, которую вы хотите поддерживать (например, 2.2.1).

При сборке вы используете базовый SDK. Для всех символов, которые определены в вашем базовом SDK, но не доступны в вашей цели развертывания, вам нужно добавить проверки кода во время выполнения, чтобы проверить их доступность. Примеры:

  1. Проверьте, доступен ли UIPasteboard:

    Class PasteboardClass = NSClassFromString(@"UIPasteboard");
    if (PasteboardClass != nil) {
        // UIPasteboard is available
    }
    
  2. Проверьте, доступен ли конкретный метод:

    if ([UITableViewCell respondsToSelector:@selector(initWithStyle:reuseIdentifier:)]) {
        // ...
    }
    
0 голосов
/ 18 апреля 2010

Я не пробовал это, но я бы порекомендовал сборку с самой последней (3.x) версии SDK. Таким образом, вы получаете любые определения классов и методов, которые могут быть доступными на целевом устройстве.

И в вашем приложении вы должны проверить версию ОС, на которой работает ваше приложение. Исходя из целевой ОС, вы должны решить, какой класс и метод вам следует использовать. В конце концов, это большой беспорядок условного кода, возможно, с большим количеством дополнительного кода для обеспечения отсутствующей функциональности (т.е. прямой доступ к SQLite вместо использования Core-Data). По моему опыту, это не должно приводить к проблемам, потому что большая часть информации о типах стирается во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...