Design patterns 什么';这是一种很好的禁用';不支持什么?

Design patterns 什么';这是一种很好的禁用';不支持什么?,design-patterns,ios,game-center,Design Patterns,Ios,Game Center,我想这个问题与语言无关,尽管我问的是如何构建一个使用新游戏中心API的iPhone应用程序,但请随意用一般软件工程术语回答 我正在为iPhone开发一款游戏,它利用了新的游戏中心功能(即自动匹配、排行榜、成就等),但我想编写一款游戏,使其能够在所有iPhone上运行,包括那些没有安装游戏中心且无法使用游戏中心功能的iPhone。为此,苹果公司建议采用 “我们建议制作一个版本的应用程序,动态检测Game Center是否可用,并基于此使用它。” 在我目前的编程水平下,实现这一点的简单方法是检查Ga

我想这个问题与语言无关,尽管我问的是如何构建一个使用新游戏中心API的iPhone应用程序,但请随意用一般软件工程术语回答

我正在为iPhone开发一款游戏,它利用了新的游戏中心功能(即自动匹配、排行榜、成就等),但我想编写一款游戏,使其能够在所有iPhone上运行,包括那些没有安装游戏中心且无法使用游戏中心功能的iPhone。为此,苹果公司建议采用

“我们建议制作一个版本的应用程序,动态检测Game Center是否可用,并基于此使用它。”

在我目前的编程水平下,实现这一点的简单方法是检查Game Center是否可用,并相应地设置一个简单的布尔标志。然后使用该标志控制整个软件的执行流。我相信我可以做到这一点,但因为我喜欢学习和编程,我想知道是否有更好的方法或设计模式来禁用不受支持的功能块,同时控制执行流


提前感谢您的智慧

您在这些情况下通常使用的称为。在您的例子中,您需要为应用程序中使用的游戏中心功能构建一个包装器,然后是两个实现——一个可能只对游戏中心进行代理调用,另一个根据需要返回固定答案


我会注意到,我从来没有做过任何iOS/objective C编程,所以我不知道如何在那种环境中正确地实现它。

在苹果的开发网站上查看游戏工具包代码示例。它们实现了一个GameCenterManager类,该类将很好地满足您想要完成的任务。

我通常使用一个简单的C风格函数来测试对Game Center的支持,该函数扩展了Apple推荐的方法。这增加了对iPodtouch第1代和3G机型的设备测试,因为苹果的代码没有考虑这些设备

#import <sys/utsname.h>

BOOL isGameCenterAvailable()
{
    // Check for presence of GKLocalPlayer API.
    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

    // The device must be running running iOS 4.1 or later.
    NSString *reqSysVer = @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);

    // 1st Gen iPod and 3G don't support Game Center
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *theModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if ([theModel isEqualToString:@"iPhone1,2"] ||
        [theModel isEqualToString:@"iPod1,1"])
    {
        return FALSE;
    }

    return (gcClass && osVersionSupported);
}

您将完全按照您所描述的方式实现它:)更具体地说,有一个包装类/对象,所有gamecenter调用都要通过它。该类检查API是否实际可用,并做出适当的响应,应用程序的其余部分可以不受游戏中心检测的影响。如果gamecenter API以后发生更改,只需在应用程序中的一个位置进行更改。
if (isGameCenterAvailable())
{
    // display game center UI
}