Contents

fserrazes/gamecenterkit

A Swift package for iOS that wraps GameKit with support for UIKit and SwiftUI.

Swift Package Manager

Add the following to your package dependencies:

.package(url: "https://github.com/fserrazes/GameCenterKit.git", branch: "main")

Usage

Requirements

  1. The local player must be authenticated on Game Center

2. Your app must have a leaderboard identifier defined in App Store Connect.

Authenticate Player

Authenticates the local player with Game Center (must be done before other actions).

Completion-based API:

GameCenterKit.shared.authenticate { isAuthenticated in
if isAuthenticated {
    // Local player is authenticated
} else {
    // Local player is not authenticated
}

Async/await API:

let state = await GameCenterKit.shared.authenticate()

Present Game Center UI

There are 3 options:

1. Toggle AccessPointView 2. Present from a ViewController (UIKit) 3. Present from a View (SwiftUI)

Toggle AccessPointView

GameCenterKit.shared.toggleGameAccessPointView()

UIKit Example

do {
    try GameCenterKit.shared.showGameCenter(viewController: self)
} catch {
    print(error)
}

SwiftUI Example

import SwiftUI
import GameCenterKit

struct ContentView: View {
    @State var isGameCenterOpen: Bool = false
    
    var body: some View {
        VStack {
            Button("Open GameCenter View") {
                isGameCenterOpen = true
            }
            .buttonStyle(.borderedProminent)
            .padding()
        }
        .sheet(isPresented: $isGameCenterOpen) {
            GameCenterView()
        }
    }
}

Leaderboards

Define your leaderboard identifier:

let identifierId: String = "your-app-leaderboard-id"

Retrieve Score

The score earned by the local player (time scope defined is all time).

if let score = try await GameCenterKit.shared.retrieveScore(identifier: identifierId) {
    print("best score: \(String(describing: score))")
}

Retrieve Rank

The rank earned by the local player (time scope defined is all time).

do {
    let (current, previous) = try await GameCenterKit.shared.retrieveRank(identifier: identifierId)
    print("current rank: \(String(describing: current))")
    print("previous rank: \(String(describing: previous))")
} catch {
    print(error)
}

Retrieve Best Players

The best players list and the number of total players (time scope defined is all time).

```swift let topPlayers = 10 // Number of top players (1–50)

do { let (players, totalPlayers) = try await GameCenterKit.shared.retrieveBestPlayers( identifier: identifierId, topPlayers: topPlayers ) print("total players: \(String(describing: totalPlayers))")

for player in players { print("player: \(player.displayName)\t score: \(player.leaderboard.score)") } } catch { print(error) }


### Submit Score
    

let score: Int = 10

do { try await GameCenterKit.shared.submitScore(score: score, identifier: identifierId) } catch { print(error) }

Achievements

Define your achievement identifier:

let achievementId: String = "your-app-achievement-id"

Submit Achievement

let percent = 10.0 // Progress value (0–100)

do {
    try await GameCenterKit.shared.submitAchievement(identifier: achievementId, percent: percent)
} catch {
    print(error)
}

Reset Achievements

Resets the percentage completed for all of the player’s achievements.

do {
    try await GameCenterKit.shared.resetAchievements()
} catch {
    print(error)
}

Documentation

Package Metadata

Repository: fserrazes/gamecenterkit

Default branch: main

README: README.md