IOS平台游戏如何对接GameCenter

现在随着手游市场的不断扩大,活跃在IOS平台下的游戏厂商为了增加玩家的粘性,以及为自己的游戏前途考虑都纷纷开始接入苹果国内公司的游戏平台GameCenter;今天呢我就把我对接GameCenter的一些心得以及操作分享给大家,内容很简单也希望在这方面有经验的也可以跟我分享一下。

1.itunesConnect配置:

打开ItunesConnect,选中你的应用,在自己的应用页面上面找到GameCenter选项,如图:

点击打开GameCenter显示如图效果:

apple GameCenter分为两块:“排行榜”与“成就”。首先我们先来添加排行榜:

添加成就:

每个应用的成就点数最多为1000点,属性Hidden(隐藏),如果将其设置为YES,则在用户获得成就或取得一定进展前,成就是不可见的。

如果要让用户能够接受基于已获得的成就的挑战,则需在iTunes Connect中创建成就时选中复选框“可多次获得”。

每个成就需要配置本地化描述;每个成就都有两个描述,一个在用户获得成就前显示,另一个在用户获得成就后显示。另外还需要给每个成就提供已付图像,尺寸为512X512,(应用发布后就不能删除其中的成就)

分别编辑完排行榜与成就后,最终在ItunesConnect中的效果:

对于开发者来说,GameCenter必须经过测试才能上线,没有上线的程序在测试环境中登录时会出现sandBox提示。

好了,itunesConnect部分的基本配置就介绍完了,是不是很简单。下面我们来讲一下程序部分~

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Apple为大家接入GameCenter提供了GameKit.framework,在需要使用GameCenter的类中都要导入GameKit.h;在.h文件中加入协议“GKGameCenterControllerDelegate”.

1.游戏中心管理器

创建共享的游戏管理器,不仅可以将GameCenter功能放在独立的类中,还可以轻松的在新项目中添加GameCenter功能。

判断是否支持GameCenter:

//是否支持GameCenter
- (BOOL) isGameCenterAvailable
{
    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
    NSString *reqSysVer = @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);

    return (gcClass && osVersionSupported);
}

2,身份验证

GameCenter是一种需要验证身份的服务,如果没有登录就得先验证身份,否则什么也做不了。

//身份验证
- (void)authenticateLocalUser{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

    localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){
        if (viewController != nil) {
            [self presentViewController:viewController animated:YES completion:nil];
        }
        else{
            if ([GKLocalPlayer localPlayer].authenticated) {
                // Get the default leaderboard identifier.

                [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {

                    if (error != nil) {
                        NSLog(@"%@", [error localizedDescription]);
                    }
                    else{

                    }
                }];
            }

            else{

            }
        }
    };

}

3.用户变更检测

//用户变更检测
- (void)registerFoeAuthenticationNotification{
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(authenticationChanged) name:GKPlayerAuthenticationDidChangeNotificationName object:nil];
}

- (void)authenticationChanged{
    if([GKLocalPlayer localPlayer].isAuthenticated){

    }else{

    }
}

4.提交得分

向GameCenter验证身份后,便可提交得分了。

创建GKStore对象:

- (void) reportScore: (int64_t) score forCategory: (NSString*) category{
    GKScore *scoreReporter = [[GKScore alloc] initWithCategory:category];

    scoreReporter.value = score;
    [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
        if(error != nil){
            NSData *saveSocreData = [NSKeyedArchiver archivedDataWithRootObject:scoreReporter];

            //未能提交得分,需要保存下来后继续提交
            [self storeScoreForLater:saveSocreData];
        }else{
            NSLog(@"提交成功");
        }
    }];
}

- (void)storeScoreForLater:(NSData *)scoreData{
    NSMutableArray *savedScoresArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedScores"]];

    [savedScoresArray addObject:scoreData];
    [[NSUserDefaults standardUserDefaults] setObject:savedScoresArray forKey:@"savedScores"];
}

若得分提交不成功,需要再重新提交得分:

//重新提交分数
- (void)submitAllSavedScores{
    NSMutableArray *savedScoreArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedScores"]];

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"savedScores"];

    for(NSData *scoreData in savedScoreArray){
        GKScore *scoreReporter = [NSKeyedUnarchiver unarchiveObjectWithData:scoreData];

        [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
            if(error != nil){
                 NSData *saveSocreData = [NSKeyedArchiver archivedDataWithRootObject:scoreReporter];
                //未能提交得分,需要保存下来后继续提交
                [self storeScoreForLater:saveSocreData];
            }else{
                NSLog(@"提交成功");

            }
        }];
    }
}

5.显示排行榜

创建GKLocalboardViewController来显示排行榜.

- (void)showGameCenter{
    GKGameCenterViewController *gameView = [[GKGameCenterViewController alloc] init];
    if(gameView != nil){
        gameView.gameCenterDelegate = self;

        [gameView setLeaderboardCategory:@"com.xxxx.test"];
        [gameView setLeaderboardTimeScope:GKLeaderboardTimeScopeAllTime];

        [self presentViewController:gameView animated:YES completion:^{

        }];
    }
}

- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController{
    [self dismissViewControllerAnimated:YES completion:nil];
}

6.得分成就

挑战让用户可以通过GameCenter向玩家发起得分或成就方面的挑战。挑战分为四种:“无效”,“待处理”,“已结束”,“已谢绝”。

- (void)reportAchievment:(NSString *)identifier withPercentageComplete:(double)percentComplete{
    GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier:identifier];

    [achievement setPercentComplete:percentComplete];

    [achievement reportAchievementWithCompletionHandler:^(NSError *error) {
        if(error != nil){
            NSLog(@"error:%@", [error localizedDescription]);
        }else{
            NSLog(@"提交成就成功");
        }
    }];
}

示例演示:

1.在sandbox环境中登录GameCenter

登录成功以后会在上方显示一个横幅“Welcome....”,点击GameCenter app就会显示您以及您游戏的相关信息.

3.排行榜界面

4.成就

成就的图标为在后台配置的图标;

5.添加好友

点击右上角的“加号”按钮,会弹出一个添加好友的界面,输入对方AppleID即可给对方发送好友请求。

6.发起挑战

对方收到挑战信息推送界面

好了,gameCenter的接入到这边就告一段落了,若在开发中有新的发现我会及时跟新这篇文章,欢迎大家评论分享自己的看法。

时间: 2024-11-06 18:16:15

IOS平台游戏如何对接GameCenter的相关文章

Ios平台游戏异常闪退问题之get_numerous_trampoline排查记录

案件回放: 打开游戏,进行上线前的检查,在检测功能的时候,莫名其妙的就崩溃,闪退了......立即重新拉起游戏,准备简单的重现之后找研发来修复,发现不能必现了.这个时候去提单也太Low了---找到研发问了下,本身的应用是否有做crash异常上报.(目前这一块的Open Source框架比较多,我就不在此累赘复述了)直接查看上一次的crash异常上报信息,结合symbol 信息还原堆栈信息. 案件侦测: 查看还原后的堆栈信息,有一处信息为: 发现最终导致该起"凶案"的罪犯应该是跟Mono

(转载)为什么iOS平台更容易吸引开发者?

1.iOS开发比Android开更容易赚钱 1.1 Appstore上的应用和游戏比Android play store质量高 现在Android Market变更为Android play store,App Store大概已经超过60万应用了,Android play store大约30万,App store的应用和游戏都是通过严格审核的,大多是收费的应用游戏.Android里面的色情.壁纸和铃音等垃圾应用数量也是很庞大,如果去除这些,Android Market的应用数量和质量会更缩水.当

经典好文:android和iOS平台的崩溃捕获和收集

通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人员发现和修改bug,对于提高软件质量有着极大的帮助.本文介绍了iOS和android平台下崩溃捕获和收集的原理及步骤,不过如果是个人开发应用或者没有特殊限制的话,就不用往下看了,直接把友盟sdk(一个统计分析sdk)加入到工程中就万事大吉了,其中的错误日志功能完全能够满足需求,而且不需要额外准备接收服务器. 但是如果你对其原理更感兴趣,或者像我一样必须要兼容公司现有的bug收集系统,那么下面的东西就值得一看了. 要实现崩溃捕获和收

IOS平台APP安全Checklist

#1. 前言IOS平台APP安全风险相关的一般性Checklist,保障IOS客户端安全评估的质量与效率.#2. 数据安全##2.1 传输安全该类漏洞的审查场景:APP通过网络发送或接收敏感信息,比如用户口令.用户隐私信息等,或者通过网络下发的数据执行某些敏感操作**漏洞类型说明:**由于移动设备通常是通过wifi上网,因而面临网络窃听.网络劫持等中间人攻击行为,因此对于敏感信息需要加密传输,并且对接收到的重要数据也需要进行完整性校验.如果APP自身实现了加密及完整性校验的机制,需要确认机制是否

【转】iOS平台的应用程序调试与分析

转自:看雪学院的文章 iOS平台的应用程序调试与分析 作者:zhuliang转载请保证文章完整并注明来自看雪或cd-team 本文阐述如何在iOS平台上对应用程序进行调试与分析,旨在指导新手分析iOS程序,高手请无视.内容包括软件硬件的准备.代码的解密.符号信息的获取.用gdb调试等,最后以京东LeBook为例子进行演示.1.为什么要进行调试与分析研究iOS程序有很多用处,比如:找bug或者漏洞,想知道某程序有没有漏洞或者bug.某程序能实现某功能,我想知道如何实现,如ios6发短信功能,还有比

移动平台游戏网络重连方案(转)

1.背景 移动网络信号波动频繁,给移动游戏开发者带来诸多困扰,处理不好会造成较差的用户体验以及重复扣道具等严重问题.因此弱网络问题在TDR技术评审中作为客户端重点挑战项,并且弱网络专项测试达标后方能上线.本文就过往项目中遇到的问题给出一种比较通用解决方案. 2.网络连接方式 通常游戏客户端都是通过创建socket与服务器取得连接,但也会根据使用场景划分成两种连接方式:TCP连接和HTTP连接. 1) TCP连接即我们常说的长连接.这种连接方式下socket连接一旦建立,通信双方即可相互发送数据,

Unity 接入 ios 平台

接到公司的新任务,Unity3d游戏接入ios 平台. 遇到的问题的解决: 1> Xcode cannot run using the selected device:可以在XCODE下设置,也可以在UNITY生成之前就设置player setrings —>Other Settings —>SDK Version,选为simulatorSDK就可以了.

android和iOS平台的崩溃捕获和收集

转自:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019349.html 通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人员发现和修改bug,对于提高软件质量有着极大的帮助.本文介绍了iOS和android平台下崩溃捕获和收集的原理及步骤,不过如果是个人开发应用或者没有特殊限制的话,就不用往下看了,直接把友盟sdk(一个统计分析sdk)加入到工程中就万事大吉了,其中的错误日志功能完全能够满足需求,而且不需要额外准备接收

iOS平台内存使用原则

2 iOS平台内存使用原则 2.1 对象的所有权与销毁 2.1.1 谁创建,谁释放: 如果是以alloc,new或者copy,mutableCopy创建的对象,则必须调用release或者autorelease方法释放内存: 如果没有释放,则导致内存泄漏! 2.1.2 谁retain,谁释放: 如果对一个对象发送 retain消息,其引用计数会+1,则使用完必须发送release或者autorelease方法释放内存或恢复引用计数: 如果没有释放,则导致内存泄漏! 2.1.3 没创建且没reta