什么是禁用不受支持的功能的好方法?

时间:2010-10-22 17:50:46

标签: design-patterns ios game-center

我认为这个问题与语言无关,所以我要求建立一个使用新Game Center API的iPhone应用程序,但请随时回答一般的软件工程术语。

我正在为iPhone制作游戏,利用新的游戏中心功能(即自动匹配,排行榜,成就等),但我想编写游戏以便它适用于所有iPhone,包括那些没有安装游戏中心且无法使用游戏中心功能的游戏。为此,Apple建议采用这种方法......

“我们建议制作一个版本的应用程序,动态检测游戏中心是否可用并根据它使用(或不使用)。”

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

提前感谢您的智慧!

3 个答案:

答案 0 :(得分:2)

在这些情况下您通常使用的是Facade Pattern。在你的情况下,你将为你在应用程序中使用的游戏中心的功能构建一个包装器,然后是两个实现 - 一个可能只是代理调用游戏中心而另一个实现根据需要返回罐头答案。 。

我会注意到我从未做过任何iOS /目标C编程,因此我不知道如何在该环境中实际实现这一点。

答案 1 :(得分:1)

查看Apple开发网站上的Game Kit代码示例。他们实现了一个GameCenterManager类,可以很好地完成你想要完成的任务。

答案 2 :(得分:0)

我通常使用简单的C风格功能测试Game Center支持,该功能扩展了Apple推荐的方法。这增加了iPod Touch 1st Gen和3G型号的设备测试,因为Apple的代码不考虑这些设备。

#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);
}

用法就像

一样简单
if (isGameCenterAvailable())
{
    // display game center UI
}