如何在SwiftUI中调出GameKit添加好友界面?
在SwiftUI中调出Game Center添加好友界面的解决方案
你遇到的核心问题是直接传入空的UIViewController()无法关联到当前SwiftUI的视图层级,导致弹窗无法正常显示。解决思路是获取当前应用的顶层视图控制器,再将其传入GameKit的方法中。
步骤1:添加获取顶层视图控制器的扩展
先给UIApplication写一个扩展,用来获取当前活跃的顶层视图控制器:
import UIKit extension UIApplication { func topViewController() -> UIViewController? { // 获取当前活跃的前台窗口 let keyWindow = connectedScenes .filter({ $0.activationState == .foregroundActive }) .compactMap({ $0 as? UIWindowScene }) .first? .windows .first(where: { $0.isKeyWindow }) // 遍历找到最顶层的视图控制器 var topVC = keyWindow?.rootViewController while let presentedVC = topVC?.presentedViewController { topVC = presentedVC } return topVC } }
步骤2:在SwiftUI中调用弹窗
修改你的ContentView,用上面的方法获取顶层VC后调用GameKit的添加好友方法:
import SwiftUI import GameKit struct ContentView: View { var body: some View { Button(action: { guard let topViewController = UIApplication.shared.topViewController() else { print("无法获取当前视图控制器") return } do { try GKLocalPlayer.local.presentFriendRequestCreator(from: topViewController) } catch { print("调出添加好友界面失败:\(error.localizedDescription)") } }) { Text("添加好友") } } }
注意事项
- 确保已完成GameKit的项目集成与用户授权(如开启Game Center能力、请求玩家授权等),否则调用方法会抛出错误。
- 该方法适配iOS 13及以上系统(使用
connectedScenes获取窗口,替代旧版的keyWindow)。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

