¿Qué es un buen enfoque para deshabilitar la funcionalidad que no es compatible?

Supongo que esta pregunta es independiente del lenguaje, aunque lo estoy preguntando en relación con la construcción de una aplicación de iPhone que use la nueva Game Center API, pero no dude en responder en términos generales de ingeniería de software.

Estoy desarrollando un juego para iPhone que aprovecha las nuevas capacidades de Game Center (es decir, Auto-matching, tablas de sorting, logros, etc.), pero quiero escribir el juego para que funcione en todos los iPhones, incluidos los que no tiene Game Center instalado y no puede usar las capacidades de Game Center. Para hacer esto, Apple recomienda el enfoque …

"Recomendamos hacer una versión de la aplicación que detecte dinámicamente si Game Center está disponible y lo usa (o no) en function de eso".

Con mi nivel actual de progtwigción, el enfoque simple que tomaría para implementar esto sería verificar si el Game Center está disponible o no y establecer una bandera booleana simple en consecuencia. Luego, use esa marca para controlar el flujo de ejecución en todo el software. Estoy seguro de que podría hacer que funcione, pero como disfruto aprender y disfrutar de la progtwigción, me preguntaba si hay un mejor enfoque o patrón de layout para deshabilitar bloques de funcionalidad que no son compatibles, además de controlar el flujo de ejecución.

¡Gracias de antemano por tu sabiduría!

Echa un vistazo a los ejemplos de código Game Kit en el sitio dev de Apple. Implementan una class GameCenterManager que funcionará bien para lo que está tratando de lograr.

Lo que generalmente usa en estos casos se llama Patrón de fachada . En su caso, crearía un contenedor para las funciones del centro de juegos que usa en su aplicación, y luego dos implementaciones, una que probablemente haga poco más que llamadas de proxy al centro de juegos y otra que devuelva las respuestas enlatadas según sea necesario .

Observaré que nunca he hecho ninguna progtwigción de iOS / objective C, así que no tengo idea de cómo uno realmente implementaría esto correctamente en ese entorno.

Suelo probar el soporte de Game Center con una simple function de estilo C que amplía el método recomendado por Apple. Esto agrega una testing de dispositivo para los models iPod Touch 1st Gen y 3G, ya que el código de Apple no count para esos dispositivos.

#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] != NSOrdenetworkingAscending); // 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); } 

El uso es tan simple como

 if (isGameCenterAvailable()) { // display game center UI }