2010-10-22 29 views
3

我想这个问题是语言不可知的,我要求它建立一个使用新的Game Center API的iPhone应用程序,但请随意回答一般的软件工程术语。什么是禁用不支持的功能的好方法?

我正在为利用新游戏中心功能(即自动匹配,排行榜,成就等)的iPhone构建一款游戏,但我想编写游戏以使其适用于所有iPhone ,包括那些没有安装Game Center并且无法使用Game Center功能的游戏。要做到这一点,苹果推荐的方法...

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

随着我目前的编程水平,我将采取的简单方法来执行此操作将检查是否可用Game Center,并相应地设置一个简单的布尔标志。然后使用该标志来控制整个软件的执行流程。我确信我可以完成这项工作,但是因为我喜欢学习并喜欢编程,所以我想知道是否有更好的方法或设计模式来禁用不支持的功能块,并控制执行流程。

在此先感谢您的智慧!

回答

1

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

2

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

我会注意到,我从来没有做过任何iOS /目标C编程,所以我不知道如何在该环境中实际实现这个。

+0

你就确实实现它为你描述:)更具体地说,有一个包装类/对象,所有的GameCenter的呼叫经历。该类会检查API是否实际可用,并作出适当的响应,并且该应用程序的其余部分可能与Game Center检测无关。如果以后的游戏中心API发生变化,只需要在应用中的一个地方进行更改即可。 – Jaanus 2010-10-22 18:17:20

+0

这听起来像一个非常优雅的解决方案,谢谢! – BeachRunnerFred 2010-10-22 18:28:37

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 
} 
相关问题