处理游戏中心身份验证

2024-01-08

根据苹果文档 https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKLocalPlayer_Ref/Reference/Reference.html我们应该这样做来处理 GC 身份验证:

- (void) authenticateLocalUser
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

    if(localPlayer.authenticated == NO)
    {
        [localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) {
            if (!error && viewcontroller)
            {
                DLog(@"Need to log in");
                AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
                [appDelegate.window.rootViewController presentViewController:viewcontroller animated:YES completion:nil];

            }
            else
            {
                DLog(@"Success");

            }
        })];

    }
}

我们得到以下信息:

如果设备没有经过身份验证的玩家,Game Kit 会将视图控制器传递给您的身份验证处理程序。当出现时,该视图控制器会显示身份验证用户界面。您的游戏应该暂停需要用户交互的其他活动(例如游戏循环),呈现此视图控制器,然后返回。当玩家完成与其交互时,视图控制器将自动关闭。

我的问题是,我们如何知道这个视图控制器何时被解雇,以及我们如何知道身份验证是否成功?

显然,我需要知道身份验证是否有效,并且如果因为出现了神奇的 GC 视图控制器而不得不暂停游戏,我需要知道何时恢复游戏。


您的代码存在问题:首先,您应该在应用程序加载后立即设置身份验证处理程序。这意味着无论 localPlayer 是否经过身份验证,您都可以设置处理程序,以便在玩家注销并再次登录时自动调用它。如果您的玩家从您的应用程序切换到游戏中心应用程序,并注销/登录,则不会调用您应用程序中的处理程序(如果他在应用程序首次启动时已经通过身份验证)。设置处理程序的目的是,每次身份验证更改(输入/输出)时,您的应用程序都可以执行正确的操作。

其次,你不应该依赖错误来做任何事。即使返回错误,游戏工具包仍可能有足够的缓存信息来为您的游戏提供经过身份验证的玩家。这些错误只是为了帮助您进行调试。

要回答您的问题,请首先查看下面的代码示例。

-(void)authenticateLocalPlayer
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

    //Block is called each time GameKit automatically authenticates
    localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error)
    {
        [self setLastError:error];
        if (viewController)
        {
            self.authenticationViewController = viewController;
            [self disableGameCenter];
        }
        else if (localPlayer.isAuthenticated)
        {
            [self authenticatedPlayer];
        }
        else
        {
            [self disableGameCenter];
        }
    };
}

-(void)authenticatedPlayer
{
     GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    [[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil];
    NSLog(@"Local player:%@ authenticated into game center",localPlayer.playerID);
}

-(void)disableGameCenter
{
    //A notification so that every observer responds appropriately to disable game center features
    [[NSNotificationCenter defaultCenter]postNotificationName:UNAUTHENTICATED_NOTIFICATION object:nil];
    NSLog(@"Disabled game center");
}

在我的应用程序中,调用authenticateLocalPlayer仅在应用程序启动时创建一次。这是因为此后会自动调用处理程序。

how do we know when this view controller gets dismissed,

你不会知道这个视图控制器什么时候被解雇。 文档中的代码示例表示在适当的时间显示视图控制器。这意味着您不必显示视图控制器every游戏中心无法登录的时间。事实上,您可能不应该立即将其呈现在处理程序中。仅当玩家需要继续执行手头的任务时,才应显示视图控制器。它不应该在奇怪的时间出现。这就是我保存视图控制器的原因,以便稍后可以在有意义的时候显示。

如果我必须暂停游戏,我需要知道何时恢复游戏,因为 神奇的 GC 视图控制器被呈现。

如果您将身份验证处理程序设置为根据状态更改发布通知,您可以侦听该事件并显示“暂停菜单”或其他内容,该菜单将一直保留到用户选择恢复为止。

我们如何知道身份验证是否成功

如果身份验证成功,则视图控制器为零,并且localPlayer.isAuthenticated是真的。

or not ?

如果验证失败,则localPlayer.isAuthenticated为 false,并且视图控制器为零。身份验证失败可能由于多种原因(网络等)而发生,在这种情况下您不应该呈现视图控制器,这就是视图控制器将为 nil 的原因。在这种情况下,您应该禁用游戏中心功能,直到用户接下来登录。由于身份验证处理程序是自动调用的,因此大多数时候您不需要执行任何操作。如果您想提示用户在游戏中心执行某些操作(您无法通过代码自动执行此操作),您始终可以提供一种从应用程序启动游戏中心应用程序的方法。

编辑:使用类似的标志self.isAuthenticated(正如我上面所做的)跟踪您是否登录并不是一个好主意(我不想引起任何混乱,所以我没有删除它)。最好经常检查[GKLocalPlayer localPlayer].isAuthenticated

编辑:稍微清理了代码 - 删除了不必要的 self.isAuthenticated 和不需要的块变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理游戏中心身份验证 的相关文章

  • 基于资源的访问控制与基于角色的访问控制

    我正在学习 Apache Shiro 发现了这篇文章 新的 RBAC 基于资源的访问控制 http www stormpath com blog new rbac resource based access control 作者说 您可以将
  • 如何支持滑动删除具有组合布局的 UICollectionView 列表中的行?

    以前对于表视图 这是在UITableViewDataSource委托回调tableView commit forRowAt 相关 API 中是否有等效功能新的集合视图 https developer apple com documentat
  • 如何使用 Expo 播放 Youtube 视频

    我正在尝试使用反应本机 YouTube 组件 https github com inProgress team react native youtube在我的世博项目中 但是 我无法让它发挥作用 到目前为止 我所拥有的只是带有红色边框的黑屏
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • CF 类型的带有 __attribute__((NSObject)) 的强 @property 不会保留

    更新 自 Xcode 4 6 起 此问题已得到修复 现在 这项技术再次按预期发挥作用 但是 在代码中使用之前 请务必阅读 Rob Napier 出色答案顶部的注释 原帖 ARC Xcode 4 3 1 iOS 5 1 我有一个 CF 类型
  • 使用 Core Data Swift 对 TableView 和行进行分区

    我在 sqlite 中有两个表 代码由 XCode Generation 生成 class Event NSManagedObject NSManaged var startDate NSDate NSManaged var details
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署
  • CBPeripheralManager 连接回调

    我正在尝试在两个 iOS 设备之间建立蓝牙连接 这个想法是 一个设备提供一项服务 多个设备连接到该服务 设备 A 服务 用户滑动浏览演示文稿 设备 B 多个客户端 用户观看演示 无交互 根据我的理解 提供服务的人应该通过创建 CBPerip
  • 既然 Gradle 和 Maven 都弃用了 http,如何使用 Liferay Mobile SDK 6.2.18 生成 jar 库?

    在我当前的项目中 我们正在维护 开发使用客户网站 liferay 6 2 服务的移动 android iOS 应用程序 每当后端的人员生成新服务 或者只是将现有服务更新为具有新功能的新版本 时 我们需要使用 Liferay Mobile S
  • Swift 为 .toInt 提供Optional(3) 而不是 3

    尝试从字段中提取数字并继续获取可选 数字 而不是数字 IBOutlet weak var years UITextField IBAction func calculateYear sender AnyObject var a years
  • React Native 检查平板电脑或屏幕是否以英寸为单位

    我为平板电脑和移动设备建立了不同的渲染逻辑 我想知道是否有办法获取屏幕尺寸 以英寸为单位 或者甚至可能是任何模块自动检测设备是否是平板电脑 我没有直接使用尺寸 API 来获取屏幕分辨率的原因是 许多 Android 平板电脑的分辨率低于许多
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 在哪里可以找到有关 IOS 日历同步的优秀教程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发 iPhone 应用程序 如何将新事件与 iOS 日历同步 您可以浏览此 github 代码
  • 为什么我的matchedGeometryEffect根据右下点移动?

    我只是尝试使用matchedGeometryEffect 制作一些动画 但是 存在一个错误 即该对象是根据右下点而不是中心进行动画处理的 我使用的代码在这里 import SwiftUI struct Test View Namespace
  • 在 Objective-C iPad 开发中发布

    我正在尝试发出 POST 请求 但我似乎无法弄清楚出了什么问题 我从服务器收到响应 但我的电子邮件 密码对似乎没有正确发送 读取 由服务器 它告诉我不存在这样的帐户 这是我的代码 它包含在一个函数中 当用户按下我创建的 登录 按钮时调用该函
  • 从 ios 和 android 端连接到 xmpp 时获取所有群组消息

    我在用开放火版本 4 0 1 使用开火Rest Api https github com gidkom php openfire restapi我在服务 servicename xx xx xxx xxx 中创建了群聊室 现在房间已创建 发
  • UIWebView stringByEvaluatingJavaScriptFromString 在后台

    在 iOS 应用程序中 我正在运行一个相当大的脚本UIWebView using stringByEvaluatingJavaScriptFromString 就 JavaScript 字符串的长度而言较大 调用 JavaScript 后会
  • EXC_BAD_INSTRUCTION 的 CoreData 错误(代码=EXC_I386_INVOP,子代码=0x0)

    当我打开并发调试开关 com apple CoreData ConcurrencyDebug 1 来跟踪 CoreData 的所有并发问题时 在调用 insertingNewObjectForEntityForName 时不断发生崩溃 Xc
  • NSFetchedResultsController 中的部分名称与托管对象值不匹配

    我正在使用 NSFetchedResultsController 用大约 1500 个实体的中等大小的核心数据存储的结果填充 UITableView 结果控制器相当标准 一些潜在错误的 热点 并不适合此设置 在与其使用的同一 主 线程上创建
  • 如何在没有 Xcode 的情况下提交 iOS 应用程序?

    我是一名合同开发商 我已经为客户编写了一个应用程序 是的 使用 Xcode 现在我们准备发货了 我想向他发送一份应用程序副本 他可以签署该副本并将其提交到 iTunes 应用程序商店 但是他没有或没有使用 Xcode 虽然这是一个备份计划

随机推荐

  • 基于 Windows 的 apache 服务器 (wamp) 上的 cakephp 和 httpd.conf 问题

    所以 我想知道是否有人可以澄清以下事件 并建议我如何解决这个问题 对于代码的奇怪颜色感到抱歉 我先解释一下设置 我安装了 wamp 服务器 它物理上位于一个硬盘上 然后我的开发文件位于单独的硬盘上 所以我添加了别名来访问特定的开发文件夹 在
  • 无法使用 Android Studio 将模块依赖项添加到 Cordova 项目的 CordovaLib

    我无法弄清楚如何添加CordovaLib目录作为 Android Studio 中的模块依赖项 注意 这是我第一次使用 Android Studio 所以可能我只是不知道我在做什么 我在用着 OSX优胜美地 安卓工作室1 1 0 科尔多瓦4
  • 划分web.config

    我正在开发一个 asp net 项目 但还没有很长的 web config 文件 超过 400 行 但有了这个 nhibernate log4net 和 urlrewrites 它变得越来越大 有没有正确的方法将 web config 分成
  • Eclipse 字符编码

    我正在使用 Scanner 扫描 Java 中的 txt 文档 但是 当我在 Eclipse 中打开 txt 文档时 我注意到某些字符无法被识别 并且它们被替换为如下所示的内容 这些字符甚至不允许我扫描文件 while scan hasNe
  • 使用 VBA 仅引用 Excel 表格数据主体范围的一部分

    我找到了参考的解决方案整行 列 or a 单细胞在表内 例如ListObject Excel 表格的 VBA 指南 https stackoverflow com a 43541508 8345185 但没有具体的范围 示例 Table1
  • 使用 ng 模型变量使用 ng 角度 2 的变化

    如何在 Angular 2 中使用 ng change 事件 每当 ng model 变量发生变化时 就必须调用一个函数 ngModel variable ngchange variable 你可以使用ngModelChange event
  • Flutter Cloud Firestore 添加复杂类型抛出无效参数:“团队”实例

    我有一个 Match 类 其中包含 Team 类型的其他类的列表 仅当列表为空时 才可以将新文档 匹配 上传到 Firestore 一旦列表中存在团队项目 请尝试将其添加到 Firestore 中无效参数 团队 实例 Team类只包含简单的
  • 如何从 Json 序列化中排除属性

    我有一个 DTO 类 我将其序列化 Json Serialize MyClass 我怎样才能排除public它的财产 它必须是公开的 因为我在其他地方的代码中使用它 如果您使用 Json Net属性 JsonIgnore 在序列化和反序列化
  • SSI 还是 PHP Include()?

    基本上我很快就会推出一个网站 我预计会有很多流量 就场景而言 假设我每天会有 100 万个独立用户 数据将是静态的 但我也需要包含 我只会在另一个 html 页面中包含一个 html 页面 没有任何动态 为了保持简单 我不会透露我的原因 我
  • 检测 viewpager 中的触摸/点击事件

    我对 Android 开发还很陌生 目前我正在使用 viewpager 试图了解如何处理触摸 点击事件 我花了整个早上寻找这个问题的答案 但似乎找不到任何对我有帮助的东西 基本上我有一个带有 5 个片段的 viewpager 它们都使用相同
  • 为什么 Visual Studio Code 忽略我的tasks.json 文件?

    我对tasks json 有一个问题 我通过将其简化为以下内容来简化它 在我的 Visual Studio Code 项目的根目录中 文件资源管理器侧边栏内清晰可见的根文件夹是 vscode 而 vscode 内部是tasks json 这
  • MYSQL PHP 按日期排序并将结果按每个日期分组

    我试图寻找问题的解决方案 但我不太确定我在寻找什么 所以我运气不佳 我有一个简单的 MySQL 数据库 其中有一个名为 活动 的表 在该表中 我有 start date activity description 和 activity loc
  • 用原则 2 设置 LIMIT?

    我尝试编写一个查询 使用子查询 但我不知道如何在子查询中设置限制 我的查询 query ids this gt getEntityManager gt createQuery SELECT e id FROM MuzichCoreBundl
  • 在 CentOS 7.7 上初始化 MariaDB 10.4.12

    我在计算机上配置了 3 个驱动器 1 个用于数据文件 1 个用于事务日志文件 1 个用于临时文件 我想在 yum 安装后第一次运行时初始化 MariaDB 这是我的步骤 使用以下参数创建 etc my cnf mysqld aria log
  • 将 NuGet contentFiles 传递到引用的项目

    我有一个 NuGet 包 其中有一个打包为Content in contentFiles folder 然后我有两个带有 SDK 样式 csproj 的 C 项目 A 和 B 其中项目B参考项目A as a ProjectReference
  • 如何使用数据注释属性类来消除表单中的空字符串?

    我试图在表单中要求一个文本输入字段 这意味着表单中需要有一些内容 然而 添加一个 Required 我的模型的标签不起作用 具体来说 查看用户名属性 public class ColumnWidthMetaData DisplayName
  • 结构图 Web Api 2 帐户控制器和个人帐户

    我对 IOC 和 web api 2 相当陌生 但已经让 StructureMap 在 web api 2 中的我自己的控制器上工作 我没有管理的是使用个人帐户在 AccountController 上使用 StructureMap 我使用
  • 在 Firefox 附加组件中打开套接字连接

    我想从 JavaScript 中的 Firefox 插件中打开套接字连接 传出 而不是侦听 nsIServerSocket 连接应该是 TCP 到指定端口上的本地主机 并将用于与计算机上运行的另一个进程进行通信 我怎样才能打开这样的客户端套
  • ionic4/Angular7 - 类型“文件”上不存在属性“dataDirectory”

    i user 文件传输 https ionicframework com docs native file transfer 下载需要的文件文件本机 https ionicframework com docs native file还 在i
  • 处理游戏中心身份验证

    根据苹果文档 https developer apple com library ios documentation GameKit Reference GKLocalPlayer Ref Reference Reference html我