iOS第三方验证简单接入Game Center
本文源链接: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相关推荐
- 常用的iOS第三方框架
转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与To ...
- 结合正则 抓取的iOS 第三方
+++++抓取方法在后面+++++ 第三方 用途 EGOTableViewPullRefresh 最早的下拉刷新控件. SVPullToRefresh 下拉刷新控件. XHRefreshControl ...
- IOS 第三方开源库汇总
IOS 第三方开源库汇总 1. 常用开源库简介 2. 统计工具 3. 数据埋点工具 4. 社交分享集成工具 5. 网络通信,网络数据工具 6. 音视频处理工具 7. 图像处理工具 8. 云存储 9. ...
- 手把手教你使用CocoaPods管理你的iOS第三方开源类库
手把手教你使用CocoaPods管理你的iOS第三方开源类库 本文转载自:http://kittenyang.com/cocoapods 鉴于我开这个博客的初衷是记录自己平时的技术积累,而我平时又属研 ...
- 微信公众号自动回复html,[.NET] 简单接入微信公众号开发:实现自动回复
简单接入微信公众号开发:实现自动回复 一.前提 先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID.开发者密码.IP白名单.令牌和消息加解密密钥等). 二.基本配置信息解读 开发者ID:固定 ...
- iOS第三方集成之jpush极光推送
iOS第三方集成之jpush极光推送 现在很多app都带推送功能,极光推送是很受大家欢迎的第三方推送,本文将为iOS初学者和初次设计开发推送的攻城狮们提供以下自己的使用心得. 大家可以边参考官方文档, ...
- 关于WEB页面处谷歌验证的接入
首先我们需要认识到什么是reCAPTCHA reCAPTCHA 验证"机制可以提供保护,避免发生由机器人导致的垃圾邮件或滥用. 通过此机制,将向用户显示一个Web 页面,其中包含Google ...
- Java支付宝身份验证接口接入指南(人脸验证)
Java支付宝身份验证接口接入指南 最近公司项目有人脸身份核验的需求,首先就想到了支付宝的身份验证接口,于是就需要看支付宝的开放api文档,这里就有些坑,然后就本次接入遇到的坑,做个整理.(基于web ...
- IOS第三方框架集合
简 注册 登录 添加关注 作者 xuejunjun 2015.06.06 17:39* 写了14057字,被17人关注,获得了116个喜欢 IOS第三方框架集合 字数6100 阅读17132 评 ...
- fir.im Weekly - 热门 iOS 第三方库大盘点
本期 fir.im Weekly 收集的热度资源,大部分关于www.gyjqfkyy.comAndroid.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内 ...
最新文章
- ios中tableview网封装(viewcontroller封装)常用的
- Python日期操作
- 一文读懂Https的安全性原理、数字证书、单项认证、双项认证等
- Python 海龟画图(turtle)常用的颜色单词
- 关于mysql数据库的外键插入报错:Cannot add or update a child row: a foreign key constraint fails,完整性问题
- 多重 for 循环,如何提高效率?
- linux推出超级用户_linux添加root权限用户
- SpringMVC配置静态资源加载, 中文乱码处理,注解驱动
- three.js 源代码凝视(七)Math/Euler.js
- 疫情风向标?苹果宣布将暂时关闭大中华区以外的所有苹果零售店!
- 贪心算法的python实现
- 数据分析职场路上有困惑?不妨花几分钟来看看...
- 自助BI项目实施可行性分析报告
- _beginthread和_beginthreadex()
- 计算机在未来对人类生活的影响,日常生活中计算机技术的发展对我们的影响
- 遥感影像的比例尺和分辨率的关系
- 下载jupyterlab中的文件夹
- Broccoli Tree Creator 使用说明 3_3、Girth Transform Node (周长变换节点)
- “太湖论道 数字制造——世界物联网博览会·工业大数据峰会”成功召开!
- kodi字幕下载_如何在Kodi中下载电影和电视节目的字幕
热门文章
- matlab 矩阵分解行满秩,matlab生成满秩矩阵
- 矩阵满秩分解原理解释
- 屏幕显示密度dpi_手机屏幕尺寸,分辨率,密度,dpi,dip,px,sp等详解
- MAC 录屏工具,录制视频制作GIF—— LICEcap
- 网红茶饮难逃“短命”之殇,喜茶能否打破这个魔咒?
- python的合法命名,以下不是Python语言合法命名的是:A、MyGod5B、5MyGodC、_...
- RepeatMasker使用
- 用非门74HC04与无源晶振产生时钟信号的两种电路
- 百度Java出现:“现在学java的都是傻子”相关搜索!
- SpringMVC使用Jedis发布后提示java.lang.ClassNotFoundException: redis.clients.jedis.Jedis问题