iOS Swift开发:Game Center点击关闭按钮无法正常dismiss问题求助
Game Center关闭按钮无回调问题排查方案
最高概率触发原因
你实现的代理方法缺少@objc修饰符,GKGameCenterControllerDelegate是Objective-C原生协议,Swift实现其方法时如果不加@objc,runtime层无法识别到方法实现,会直接导致回调不触发。
修正步骤
- 第一步:给代理方法添加
@objc修饰符
修改后的代理方法代码如下:
@objc func gameCenterViewControllerDidFinish(_ gameCenterViewController: GKGameCenterViewController) { gameCenterViewController.dismiss(animated: true, completion: nil) print("clicked") }
- 第二步:将GKGameCenterViewController实例改为类属性,避免局部变量提前被ARC释放
在MainMenu类的属性声明部分添加全局gc属性:
var gc: GKGameCenterViewController?
对应修改showLeaderboard方法的实现:
func showLeaderboard(){ guard let vc = self.view?.window?.rootViewController else { return } // 改为类属性存储实例,防止提前释放 self.gc = GKGameCenterViewController() self.gc?.gameCenterDelegate = self self.gc?.viewState = .leaderboards self.gc?.leaderboardIdentifier = "superbounceleaderboard" vc.present(self.gc!, animated: true, completion: nil) }
- 第三步:校验项目基础配置
打开Xcode项目的Signing & Capabilities标签,确认已经添加Game Center能力,同时当前使用的Bundle ID与App Store Connect中配置的游戏Bundle ID完全一致。
补充校验项
如果以上修改后仍无回调,可以做如下排查:
- 在
gc.gameCenterDelegate = self代码后添加打印print(gc.gameCenterDelegate),确认输出不为nil,代表代理赋值成功 - 如果你的App存在多层控制器弹出场景,不要用rootViewController作为present的主体,改为获取当前最顶层的控制器来present,避免控制器层级异常导致回调失效
内容的提问来源于stack exchange,提问作者Chad Martin
相关产品推荐
相关产品推荐

