11

我想为 iPhone 和 iPad 开发一款游戏。因此,从头开始这个项目作为一个通用应用程序是有意义的。但是,iPhone 和 iPad 目前运行两个不同版本的 iOS,因为 iOS 4 还不能用于 iPad。我想在我的游戏中支持两个 iOS 4 功能(GameCenter 和 iAd)。

  1. 在这种情况下,将此项目创建为通用应用程序是不是一个坏主意?
  2. 如果不是,在构建支持两个不同版本 iOS 的通用应用程序时,我应该考虑哪些想法?
  3. 像推测的那样,押注 Apple 在秋季发布适用于 iPad 的 iOS 4 是否有点安全?
  4. 如果是这样,我是否可以开始将这些 iOS 4 功能(GameCenter 和 iAd)构建到我的 iPad 版本的游戏中?

非常感谢您的智慧!

编辑:我知道这个问题涉及管理风险。我知道这些风险,但是当 iOS 在各种 iOS 设备中分散时,我对与构建通用应用程序相关的任何技术设计考虑更感兴趣。

4

4 回答 4

16

如果您要构建一个通用应用程序,请记住以下两个源代码片段:

  • 仅当类在当前设备上可用时才使用它们

    考虑这段代码:

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

    在构建通用应用程序时,此代码将导致在任何运行不知道 UILocalNotification 类的 iOS 版本的设备上出现运行时错误。

    您仍然可以在代码中支持 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 不同的 UI。而且,不幸的是,您将无法使用 iOS 4 功能测试您的 iPad UI,直到它们在 iPad 上可用。但这应该不是什么大问题:如果你[[UIDevice currentDevice] userInterfaceIdiom]用来检查你是否在 iPad 上运行,你可以阻止你的 Universal App 执行还没有 iPad UI 的代码。Apple 发布适用于 iPad 的 iOS 4 后,您可以实施 UI,删除该检查并向商店发布更新。

于 2010-07-23T17:20:44.483 回答
11

你主要需要做两件事:

  1. 弱链接 3.2 SDK 中不存在的任何框架。
  2. 为 iOS 4 的任何新 API 编写运行时测试。

首先,右键单击您的目标并选择“获取信息”。框架列在检查器中(在“常规”选项卡下),旁边有一个下拉框,允许您选择“弱”链接。这确保了如果框架不存在,应用程序仍将运行。

要执行第二个操作,您可以执行以下操作来测试 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 版本单独编译,因此要使其真正发挥作用,您必须发布该应用程序的多个版本。

于 2010-07-23T17:19:36.467 回答
2

关于这个主题的一篇好文章:http: //cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

于 2010-07-23T17:19:07.313 回答
1

这是一个关于风险管理的问题。风险包括:

  1. Apple 不会在您需要的时间范围内发布预期的“统一 4.1”操作系统
  2. 操作系统会根据您的需要及时发布,但不包括 GameCenter 或 iAd 中的一个或两个
  3. 包含 GameCenter 和/或 iAd,但它们与您期望的 API 不匹配
  4. API 符合您的预期,但由于它是 iPad 上的第一个版本,因此它们有问题
  5. ETC...

只有您可以确定您对每种风险的适应程度、您认为每种风险的可能性有多大、您是否可以减轻每种风险以及在此过程中出现任何这些问题的成本是多少。

于 2010-07-23T17:01:29.310 回答