Какой хороший подход к отключению функциональности, которая не поддерживается? - PullRequest
3 голосов
/ 22 октября 2010

Я полагаю, что этот вопрос не зависит от языка, но я задаю его в отношении создания приложения для iPhone, которое использует новый API Game Center, но, пожалуйста, не стесняйтесь отвечать в общих терминах разработки программного обеспечения.

Я создаю игру для iPhone, которая использует преимущества новых возможностей Game Center (например, автоматическое сопоставление, списки лидеров, достижения и т. Д.), Но я хочу написать игру так, чтобы она работала на всех iPhone, включая те, у которых не установлен Game Center и которые не могут использовать возможности Game Center. Для этого Apple рекомендует подход ...

"Мы рекомендуем создать одну версию приложения, которая динамически определяет, доступен ли Game Center, и использует его (или нет) на основании этого."

С моим текущим уровнем программирования, простой подход, который я выбрал бы для реализации этого, состоял бы в том, чтобы проверить, доступен ли Game Center, и соответственно установить простой логический флаг. Затем используйте этот флаг для управления потоком выполнения в программном обеспечении. Я уверен, что смогу справиться с этой задачей, но, поскольку мне нравится изучать и получать удовольствие от программирования, мне было интересно, есть ли лучший подход или шаблон проектирования для отключения блоков функциональности, которые не поддерживаются, наряду с управлением потоком выполнения.

Заранее благодарим за мудрость!

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

То, что вы обычно используете в этих случаях, называется Pattern Facade .В вашем случае вы бы создали оболочку для функций игрового центра, которые вы используете в своем приложении, а затем две реализации - одна, которая, вероятно, выполняет чуть больше, чем прокси-вызовы в игровой центр, а другая, которая возвращает консервированные ответы по мере необходимости.,

Отмечу, что я никогда не занимался программированием на iOS / target C, поэтому понятия не имею, как можно было бы реализовать это должным образом в этой среде.

1 голос
/ 06 ноября 2010

Ознакомьтесь с примерами кода Game Kit на сайте разработчиков Apple. Они реализуют класс GameCenterManager, который будет хорошо работать для того, чего вы пытаетесь достичь.

0 голосов
/ 17 ноября 2010

Обычно я проверяю поддержку Game Center с помощью простой функции в стиле C, которая расширяет рекомендуемый 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
}
...