GameCenter authenticate:GKErrorDomain Code=2 "The requested operation has been cancelled."

测试GameCenter的登陆authencitate,登陆方法如下:

-(void) authenticateLocalPlayer {
    GKLocalPlayer* localPlayer =
    [GKLocalPlayer localPlayer];
    
    localPlayer.authenticateHandler =
    ^(UIViewController *viewController,
      NSError *error) {
        
        [self setLastError:error];
        
        if (CCDirector::sharedDirector()->isPaused()) {
            CCDirector::sharedDirector()->resume();
        }
        
        // Player already authenticated
        if (localPlayer.authenticated) {
            _gameCenterFeaturesEnabled = YES;
        } else if(viewController) {
            CCDirector::sharedDirector()->pause();
            [self presentViewController:viewController];
        } else {
            _gameCenterFeaturesEnabled = NO;
        }
    };
}


使用GameCenter在模拟器上运行正常,在真机第一次登陆运行就遇到了NSError错误提示:

GKErrorDomain Code=2 "The requested operation has been cancelled."


正常情况下登陆,如果你的Apple ID默认已经登陆过,会弹出欢迎XX界面

第一次登陆,会弹出GameCenter登陆AppleID的提示框

localPlayer.authenticated值为false 表示登陆失败,但是我的AppleID已经登陆过了,正常情况下是不应该失败的


最后在stackoverflow上的一哥们的方法解决了 问题可能是由于登陆函数和模拟器上的函数绑定了。。。原因不太重要,重要的解决办法

在View加载的地方调用一下如下函数:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"gamecenter:"]];

把你的APPID登陆进去 然后点 log out 注销 再把上面的代码从程序中删除掉 

再重新在真机上调试你的程序即可


解决办法参考:stackoverflow


GameCenter登陆需要注意:

1.ios6.0后需要手动设置authenticateHandler,authenticateWithCompletionHandler: 已经在6.0中丢弃不用了

2.authenticationHandler第一个参数viewController在AppleID没有登陆的时候 需要手动显示“登陆GameCenter"界面,还要需要注意暂停逻辑

localPlayer.authenticateHandler =
    ^(UIViewController *viewController,
      NSError *error)
3.这个登陆block函数在三种情况下会被调用:

  • 当你设置了authenticationHandler并发出了验证玩家的请求。
  • 当app进入foreground(前台)。
  • 在登录时,例如玩家在进入游戏前没有登录,进入时会弹出登录界面,在这个界面中的任何交互都会调用authenticationHandler。



从您的描述来看,您尝试通过 `systemctl daemon-reload` 刷新 systemd 的守护进程状态时,遭遇了身份验证失败的问题。 ### 解析错误信息 1. **AUTHENTICATING FOR...** 系统提示需要对 `org.freedesktop.systemd1.reload-daemon` 进行授权认证,因为这个操作通常涉及系统级别的改动。 2. **Authentication is required...** 明确指出重新加载 systemd 状态的操作需要更高的权限(即 root 或者具备 sudo 权限的用户)。 3. **pam_authenticate failed: Authentication failure** 认证过程未能通过,具体表现为密码输入有误或者是账户缺乏必要的权限。 4. **Access denied** 最终因权限不足而导致整个操作失败。 --- ### 可能的原因分析及解决步骤 #### 1. 用户权限不够 普通用户是没有权力去执行像 `daemon-reload` 这样的高危指令集的。因此首要任务就是切换至超级管理模式。 ```bash sudo systemctl daemon-reload ``` 如果您确定已经以正确的用户名登录并且知道该用户的口令却依然报错,请继续往下看其他可能性。 #### 2. Polkit 配置问题 Polkit 是一个用于控制程序之间交互访问策略框架的技术组件;也许它的默认规则不允许非特权用户完成此类请求。我们可以通过下面的方法暂时绕过它来进行调试: - 编辑 polkit 规则文件允许无条件接受所有来自指定来源的要求: ```bash # 创建自定义 policy 文件 echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <policyconfig> <action id=\"org.freedesktop.systemd1.manage-units\"> <allow_any>yes</allow_any> <allow_inactive>yes</allow_inactive> <allow_active>auth_admin_keep</allow_active> </action> </policyconfig>" | sudo tee /etc/polkit-1/localauthority/50-local.d/custom-systemd-manage-units.pkla ``` 接着退出并重新进入 shell session 测试新的行为表现是否会改善状况。 #### 3. Sudoers 设置不当 有时候尽管存在有效的密码组合也有可能是因为没有给相应的 user 添加进 sudo group 导致的行为受限现象发生。检查一下当前使用的 account 是否位于其中: ```bash groups $USER ``` 如果没有看到 "sudo" 字样,则应该把它加入进去: ```bash sudo adduser ${LOGNAME} sudo ``` 随后注销然后再登回来生效变化结果后再试一次先前卡住的动作序列看看是否恢复正常工作流。 --- ### 总结 以上内容涵盖了对于“polkit-agent-helper-1: pam_authenticate failed”的多种潜在诱因及其对应的处理对策介绍。如果按照这些指导依旧得不到理想的解答方案的话,不妨分享更多上下文线索供后续跟进研究探讨呀~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值