我应该如何构建包含iOS 4功能的通用iOS应用程序,即使iPad还没有运行iOS 4?

Bea*_*red 11 iphone universal-binary ipad ios4

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

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

非常感谢您的所有智慧!

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

Ben*_*min 16

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

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

    考虑一下这段代码:

    UILocalNotification* n = [[UILocalNotification alloc] init];
    
    Run Code Online (Sandbox Code Playgroud)

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

    您仍然可以在代码中支持UILocalNotification,同时使用以下代码段保持向后兼容性:

    Class notificationClass = NSClassFromString(@"UILocalNotification");
    if (notificationClass) {
      UILocalNotification* n = [[notificationClass alloc] init];
    }
    
    Run Code Online (Sandbox Code Playgroud)

    此技术允许您在支持类的设备上使用某些OS版本中不可用的类.

  • 仅在当前设备上可用时才使用方法

    假设您想要执行以下操作:

    [[UIApplication sharedApplication] scheduleLocalNotification:n];
    
    Run Code Online (Sandbox Code Playgroud)

    使用以下代码有条件地调用该方法,以防它在当前设备上可用:

    if ([UIApplication instancesRespondToSelector:@selector(scheduleLocalNotification:)]) {
      [[UIApplication sharedApplication] scheduleLocalNotification:n];
    }
    
    Run Code Online (Sandbox Code Playgroud)

这两种技术可能是您创建通用应用程序时唯一需要了解的.根据设备功能有条件地执行代码,你应该没问题.

话虽如此,您仍然需要考虑iPad可能会使用与iPhone不同的UI.而且,遗憾的是,在iPad 4上可用之前,您将无法使用iOS 4功能测试iPad UI.但这不应该是一个太大的问题:如果你[[UIDevice currentDevice] userInterfaceIdiom]用来检查你是否在iPad上运行,你可以阻止你的通用应用程序执行没有iPad UI的代码.一旦Apple发布适用于iPad的iOS 4,您就可以实现UI,删除该检查并发布对商店的更新.


Jef*_*ley 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.
}
Run Code Online (Sandbox Code Playgroud)

通过使用诸如此类的内省方法-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
Run Code Online (Sandbox Code Playgroud)

为什么这不可取?简单:只编译最高编号的iOS版本的代码.iPhone应用程序不单独IOS版本分别编译,所以得到这个实际工作,你就必须发布应用程序的多个版本.