本文源链接:http://blog.csdn.net/qq393830887/article/details/54023218

关键


1. 从2016年开始,Game Center已经取消了沙箱机制
2. 要开启Game Center,需要在iTunes Connect的Game Center处,新建一个排行榜或者成就。这个我觉得就是苹果的bug,虽然也能理解,否则的话当连入Game Center的时候,会收到error,权限没开?建完之后就可以删除的了
3. 要是取消Game Center登陆3次,虽然会收到回调,但是由于view为空,无法继续弹出登陆界面,得让玩家自己去Game Center手动登陆才行(坑爹的潜规则)

Game Center官网网址

代码

#import <GameKit/GameKit.h>@implementation GameCenterSdkController
{// 记录上次的账号,用于确认是否有登出操作NSString* _lastPlayerId;// 保证只初始化一次BOOL _hasInit;// 判断是否登陆过一次了BOOL _hasLoginOnce;
}//初始化
-(void)initsdk
{NSLog(@"初始化 init");//一般要在这里增加回调监听if (self->_hasInit){[self sendMessageToUnity:"init" code:1 data:@"想要再次验证Game Center,请切到后台再切回来,或者重启游戏。"];return;}self->_hasInit = true;[self registerForAuthenticationNotification];[self setAuthenticateLocalPlayer];
}//注销
- (void)logout
{NSLog(@"注销 logout");// 苹果没有主动登出一说[self sendMessageToUnity:"logout" code:0 data:@""];
}//登陆
- (void)login
{NSLog(@"登陆 login");[self getSignature];}//帐号管理
- (void)userCenter
{NSLog(@"帐号管理 userCenter");
}-(BOOL) isAuthenticated
{return [[GKLocalPlayer localPlayer] isAuthenticated];
}-(NSString*) getLocalPlayerId
{if ([self isAuthenticated]){return [GKLocalPlayer localPlayer].playerID;}return nil;
}// 这玩意只有第一次执行的时候会触发回调
-(void) setAuthenticateLocalPlayer
{NSLog(@"setAuthenticateLocalPlayer");GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];[localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error){[self authenticateCallback:viewcontroller Error:error];})];
}// 这玩意每次切换到桌面再切回来还会被调用一次,有点像支付
-(void) authenticateCallback:(UIViewController*)viewcontroller Error:(NSError*)error
{NSLog(@"authenticateCallback");if (viewcontroller != nil){NSLog(@"打开Game Center验证界面。");[self.rootViewController  presentViewController:viewcontroller animated:YES completion:nil];}else{// 登出再登陆的,说明已经初始化过了if (self->_hasLoginOnce){return;}// 切到后台,登出,再切回来,依旧是空viewcontroller,空error,非常神奇if ([self isAuthenticated]){self->_hasLoginOnce = true;[self sendMessageToUnity:"init" code:0 data:@""];}else{if (error){[self sendMessageToUnity:"init" code:1 data:[NSString stringWithFormat:@"code=%ld description=%@", (long)error.code, error.description]];}else{[self sendMessageToUnity:"init" code:1 data:@"Game Center登出了或者未知错误"];}}}
}-(void) getSignature
{// 如果还没有登录,特殊处理if (![self isAuthenticated]){[self sendMessageToUnity:"login" code:2 data:@"玩家还没有登录GameCenter,切到后台再切回来登陆,或者去Game Center登陆。"];return;}GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];[localPlayer generateIdentityVerificationSignatureWithCompletionHandler:^(NSURL *publicKeyUrl, NSData *signature, NSData *salt, uint64_t timestamp, NSError *error){if(error != nil){[self sendMessageToUnity:"login" code:2 data:[NSString stringWithFormat:@"code=%ld description=%@", (long)error.code, error.description]];return;}NSString* url = [publicKeyUrl absoluteString];NSString* sig = [NSString stringWithFormat:@"%@", [signature base64EncodedStringWithOptions: 0]];NSString* slt = [NSString stringWithFormat:@"%@", [salt base64EncodedStringWithOptions: 0]];NSString* stamp = [NSString stringWithFormat:@"%llu", timestamp];NSString* playerId = [GKLocalPlayer localPlayer].playerID;NSString* bundleId = [NSBundle mainBundle].bundleIdentifier;NSString* data = [NSString stringWithFormat:@"%@|%@|%@|%@|%@|%@", playerId, sig, slt, stamp, url, bundleId];NSLog(@"%@", data);[self sendMessageToUnity:"login" code:0 data:data];}];
}-(void) registerForAuthenticationNotification
{NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];[nc addObserver: self selector:@selector(authenticationChanged) name:GKPlayerAuthenticationDidChangeNotificationName object:nil];
}// 这玩意会比authenticationHandler早回调
-(void) authenticationChanged
{NSLog(@"authenticationChanged");// 登出了或者切换了账号if (self->_lastPlayerId != nil){[self logout];}self->_lastPlayerId = [self getLocalPlayerId];
}
@end
  • 其实关键在于generateIdentityVerificationSignatureWithCompletionHandler获取的数据如何验证,有空我在弄一下吧
  • setAuthenticateHandler有点像支付,第一次调用的时候会触发handler,然后每次后台切换回来也会触发
  • 退出账号这里有问题,authenticateCallback无法正确判断,只能通过GKPlayerAuthenticationDidChangeNotificationName

iOS第三方验证简单接入Game Center相关推荐

  1. 常用的iOS第三方框架

    转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与To ...

  2. 结合正则 抓取的iOS 第三方

    +++++抓取方法在后面+++++ 第三方 用途 EGOTableViewPullRefresh 最早的下拉刷新控件. SVPullToRefresh 下拉刷新控件. XHRefreshControl ...

  3. IOS 第三方开源库汇总

    IOS 第三方开源库汇总 1. 常用开源库简介 2. 统计工具 3. 数据埋点工具 4. 社交分享集成工具 5. 网络通信,网络数据工具 6. 音视频处理工具 7. 图像处理工具 8. 云存储 9. ...

  4. 手把手教你使用CocoaPods管理你的iOS第三方开源类库

    手把手教你使用CocoaPods管理你的iOS第三方开源类库 本文转载自:http://kittenyang.com/cocoapods 鉴于我开这个博客的初衷是记录自己平时的技术积累,而我平时又属研 ...

  5. 微信公众号自动回复html,[.NET] 简单接入微信公众号开发:实现自动回复

    简单接入微信公众号开发:实现自动回复 一.前提 先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID.开发者密码.IP白名单.令牌和消息加解密密钥等). 二.基本配置信息解读 开发者ID:固定 ...

  6. iOS第三方集成之jpush极光推送

    iOS第三方集成之jpush极光推送 现在很多app都带推送功能,极光推送是很受大家欢迎的第三方推送,本文将为iOS初学者和初次设计开发推送的攻城狮们提供以下自己的使用心得. 大家可以边参考官方文档, ...

  7. 关于WEB页面处谷歌验证的接入

    首先我们需要认识到什么是reCAPTCHA reCAPTCHA 验证"机制可以提供保护,避免发生由机器人导致的垃圾邮件或滥用. 通过此机制,将向用户显示一个Web 页面,其中包含Google ...

  8. Java支付宝身份验证接口接入指南(人脸验证)

    Java支付宝身份验证接口接入指南 最近公司项目有人脸身份核验的需求,首先就想到了支付宝的身份验证接口,于是就需要看支付宝的开放api文档,这里就有些坑,然后就本次接入遇到的坑,做个整理.(基于web ...

  9. IOS第三方框架集合

    简   注册 登录  添加关注 作者 xuejunjun 2015.06.06 17:39* 写了14057字,被17人关注,获得了116个喜欢 IOS第三方框架集合 字数6100 阅读17132 评 ...

  10. fir.im Weekly - 热门 iOS 第三方库大盘点

    本期 fir.im Weekly 收集的热度资源,大部分关于www.gyjqfkyy.comAndroid.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内 ...

最新文章

  1. ios中tableview网封装(viewcontroller封装)常用的
  2. Python日期操作
  3. 一文读懂Https的安全性原理、数字证书、单项认证、双项认证等
  4. Python 海龟画图(turtle)常用的颜色单词
  5. 关于mysql数据库的外键插入报错:Cannot add or update a child row: a foreign key constraint fails,完整性问题
  6. 多重 for 循环,如何提高效率?
  7. linux推出超级用户_linux添加root权限用户
  8. SpringMVC配置静态资源加载, 中文乱码处理,注解驱动
  9. three.js 源代码凝视(七)Math/Euler.js
  10. 疫情风向标?苹果宣布将暂时关闭大中华区以外的所有苹果零售店!
  11. 贪心算法的python实现
  12. 数据分析职场路上有困惑?不妨花几分钟来看看...
  13. 自助BI项目实施可行性分析报告
  14. _beginthread和_beginthreadex()
  15. 计算机在未来对人类生活的影响,日常生活中计算机技术的发展对我们的影响
  16. 遥感影像的比例尺和分辨率的关系
  17. 下载jupyterlab中的文件夹
  18. Broccoli Tree Creator 使用说明 3_3、Girth Transform Node (周长变换节点)
  19. “太湖论道 数字制造——世界物联网博览会·工业大数据峰会”成功召开!
  20. kodi字幕下载_如何在Kodi中下载电影和电视节目的字幕

热门文章

  1. matlab 矩阵分解行满秩,matlab生成满秩矩阵
  2. 矩阵满秩分解原理解释
  3. 屏幕显示密度dpi_手机屏幕尺寸,分辨率,密度,dpi,dip,px,sp等详解
  4. MAC 录屏工具,录制视频制作GIF—— LICEcap
  5. 网红茶饮难逃“短命”之殇,喜茶能否打破这个魔咒?
  6. python的合法命名,以下不是Python语言合法命名的是:A、MyGod5B、5MyGodC、_...
  7. RepeatMasker使用
  8. 用非门74HC04与无源晶振产生时钟信号的两种电路
  9. 百度Java出现:“现在学java的都是傻子”相关搜索!
  10. SpringMVC使用Jedis发布后提示java.lang.ClassNotFoundException: redis.clients.jedis.Jedis问题