2010-10-22 94 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 
} 
相關問題