Как мне подойти к созданию универсального приложения для iOS, которое будет включать в себя функции iOS 4, даже если iPad еще не поддерживает iOS 4? - PullRequest
11 голосов
/ 23 июля 2010

Я бы хотел создать игру для iPhone и iPad.Таким образом, имеет смысл начать этот проект с нуля как универсальное приложение.Тем не менее, iPhone и iPad в настоящее время работают под управлением двух разных версий iOS, поскольку iOS 4 еще не доступна для iPad.Есть две функции iOS 4 (GameCenter и iAd), которые я хотел бы поддержать в своей игре.

  1. В таком случае, плохая идея создать этот проект как универсальное приложение?
  2. Если нет, то какие мысли я должен принять во внимание при созданииуниверсальное приложение, которое поддерживает две разные версии iOS?
  3. Можно ли сделать ставку на Apple, выпустив iOS 4 для iPad осенью, как предполагалось?
  4. Если так, могу ли я в любом случае начать встраивать эти функции iOS 4 (GameCenter и iAd) в мою версию iPad для моей игры?

Заранее большое спасибо за все вашимудрость!

РЕДАКТИРОВАТЬ: Я понимаю, что эта проблема связана с управлением рисками.Я знаю о рисках, но меня больше интересуют любые технические соображения, связанные с созданием универсального приложения, когда iOS фрагментирована среди различных устройств iOS.

Ответы [ 4 ]

16 голосов
/ 23 июля 2010

Если вы собираетесь создать универсальное приложение, просто запомните следующие два фрагмента исходного кода:

  • Использование классов, только если они доступны на текущем устройстве

    Рассмотрим этот фрагмент кода:

    UILocalNotification* n = [[UILocalNotification alloc] init];
    

    При создании универсального приложения этот код приведет к ошибке времени выполнения на любом устройстве под управлением версии iOS, которое не знает о классе UILocalNotification.

    Вы все еще можете поддерживать UILocalNotification в своем коде, поддерживая обратную совместимость, используя следующий фрагмент кода:

    Class notificationClass = NSClassFromString(@"UILocalNotification");
    if (notificationClass) {
      UILocalNotification* n = [[notificationClass alloc] init];
    }
    

    Этот метод позволяет использовать классы, которые недоступны в определенных версиях ОС на устройствах, которые поддерживаютклассы.

  • Использование методов, только если они доступны на текущем устройстве

    Предположим, вы хотите сделать следующее:

    [[UIApplication sharedApplication] scheduleLocalNotification:n];
    

    Используйте следующий фрагмент кода для условного вызова метода, если он доступен на текущем устройстве:

    if ([UIApplication instancesRespondToSelector:@selector(scheduleLocalNotification:)]) {
      [[UIApplication sharedApplication] scheduleLocalNotification:n];
    }
    

Эти две техники, вероятно, единственные вещи, которые вам нужно знать, чтобы создать универсальное приложение.Выполните ваш код условно в зависимости от возможностей устройства, и с вами все будет в порядке.

Сказав это, вам все равно нужно учитывать, что iPad, вероятно, будет использовать другой пользовательский интерфейс, нежели ваш iPhone.И, к сожалению, вы не сможете протестировать свой интерфейс iPad с функциями iOS 4, пока они не станут доступны на iPad.Но это не должно быть большой проблемой: если вы используете [[UIDevice currentDevice] userInterfaceIdiom] для проверки того, работаете ли вы на iPad, вы можете помешать вашему универсальному приложению выполнять код, у которого еще нет интерфейса iPad.Как только Apple выпустит iOS 4 для iPad, вы сможете реализовать пользовательский интерфейс, снять эту проверку и выпустить обновление для магазина.

11 голосов
/ 23 июля 2010

В основном вам нужно сделать две вещи:

  1. Слабая ссылка на любые фреймворки, которых нет в 3.2 SDK.
  2. Написание тестов во время выполнения для любых API, новых для iOS 4.

Чтобы сделать первое, щелкните правой кнопкой мыши на цели и выберите «Получить информацию». Платформы перечислены в инспекторе (на вкладке «Общие») с раскрывающимся списком рядом с ними, который позволит вам выбрать «слабую» ссылку. Это гарантирует, что приложение все еще будет работать, если фреймворк отсутствует.

Чтобы выполнить второе, вы можете сделать что-то вроде следующего, чтобы протестировать новую блочную анимацию в iOS 4:

if ([UIView respondsToSelector:@selector(animateWithDuration:animations:)]) {
    // Your awesome animation code here
} else {
    // Your almost-as-awesome, non-block-based animation code here.
}

Используя интроспективные методы, такие как -respondsToSelector:, вы можете избежать вызова чего-то, что не работает в текущей ОС.

Обратите внимание, что если вы хотите поддерживать iPhone OS 3.0, будут применяться те же правила.

Наконец, также возможно - хотя и не желательно - сделать это так:

#ifdef __IPHONE_4_0
    // Your iOS 4.0-compatible code here
#elif defined(__IPHONE_3_2)
    // Your iPhone OS 3.2-compatible code here
#elif defined(__IPHONE_3_0)
    // Your iPhone OS 3.0-compatible code here
#endif

Почему это не рекомендуется? Все просто: будет скомпилирован только код для версии iOS с наибольшим номером . Приложения iPhone не компилируются отдельно для отдельных версий iOS, поэтому для того, чтобы это действительно работало , вам нужно выпустить несколько версий приложения.

2 голосов
/ 23 июля 2010
1 голос
/ 23 июля 2010

Это вопрос управления рисками.Риски включают в себя:

  1. Apple не выпускает ожидаемую «унифицированную 4.1» ОС в течение необходимого периода времени
  2. ОС выпускается вовремя для ваших нужд, но одна или обе изGameCenter или iAds не включены
  3. GameCenter и / или iAds включены, но они не соответствуют точному API, который вы ожидали
  4. API - это то, что вы ожидали, но они содержат ошибкипоскольку это первая версия для iPad
  5. и т. д.

Только вы можете определить, какой уровень каждого риска вас устраивает, насколько вероятным вы считаете каждый риск, если вы можете уменьшить каждый риск, и каковы будут затраты на решение любой из этих проблем в будущем.

...