如何以编程方式检测游戏中心?

Posted

技术标签:

【中文标题】如何以编程方式检测游戏中心?【英文标题】:How to programmatically detect Game Center? 【发布时间】:2010-09-12 19:23:51 【问题描述】:

我正在为我的游戏添加 Game Center 支持。因为我的游戏可以在 ios 版本 3.0 上运行,所以我想让它回退到在没有 Game Center 的情况下仅在本地保存成就和排行榜。

现在,我有这个:

+ (BOOL) isGameCenterAvailable 
 Class playerClass = NSClassFromString( @"GKLocalPlayer" );
 if( playerClass != nil && [playerClass localPlayer] != nil ) 
  DebugLog( @"Game Center is available" );
  return YES;
 

 DebugLog( @"Game Center is NOT available" );
 return NO;

但是,这似乎根本不起作用。一方面,尽管GKLocalPlayer reference 声明此类在iOS 4.1 及更高版本中可用,但上述测试在iOS 4.0 中通过(我没有尝试早期版本)。另一方面,该测试还通过了具有 iOS 4.1 但不支持 Game Center 的设备(例如,iPhone 3G)。

我已经在线浏览了各种 GameKit 和 Game Center 文档,但没有任何运气能够弄清楚这一点。我当然可以检测到操作系统版本,但这似乎很蹩脚。对于不受支持的硬件(如 3G)的情况,这也无济于事。我想这也可以被检测到,但同样,似乎有点蹩脚。

以编程方式检测 Game Center 支持的“正确方法”是什么?

【问题讨论】:

【参考方案1】:

这是 Apple 网站上 GameKit 文档中提供的代码:

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

    return (gcClass && osVersionSupported);

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/GameCenterOverview/GameCenterOverview.html%23//apple_ref/doc/uid/TP40008304-CH5-SW7

【讨论】:

+1 需要进行版本检查的罕见情况之一,因为之前有一些私有内容可用。 他们计划在 iOS 4.0 中发布 gamecenter,但在最后一刻将其删除...甚至在 4.0 的 Golden Master 版本中... @PEZ:代码将返回 YES,但 GC 永远不会在 3G 上进行身份验证。您可以使用代码检查是否启用 GC 功能,启用时需要验证才能实际使用它们。 3G 不会超过最后一部分。 :) 谢谢,我不想让我的用户对游戏中心身份验证对话框感到惊讶,除非他们点击按钮。除非游戏中心可用,否则我根本不想显示该按钮。

以上是关于如何以编程方式检测游戏中心?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone如何以编程方式访问通知中心

如何以编程方式使用自动布局将活动指示器定位到其超级视图的中心?

ios - 如何使用ios swift中的自动布局以编程方式将两个标签并排放置在中心位置?

以编程方式更改中心 X / Y 的对齐约束的乘数

我们如何在 iOS 7 上检测何时控制中心?

iOS - 以编程方式使用自动布局将 UIView 定位在超级视图的中心