0xWDG/GameControllerKit
GameControllerKit is a Swift package that makes it easy to work with game controllers on iOS, macOS, and tvOS. It provides a simple API to connect to game controllers, read input from them, and control their lights and haptics.
Requirements
- Swift 5.9+ (Xcode 15+)
- iOS 13+, macOS 10.15+, tvOS 16+
Installation (Pakage.swift)
dependencies: [
.package(url: "https://github.com/0xWDG/GameControllerKit.git", branch: "main"),
],
targets: [
.target(name: "MyTarget", dependencies: [
.product(name: "GameControllerKit", package: "GameControllerKit"),
]),
]Installation (Xcode)
- In Xcode, open your project and navigate to File β Swift Packages β Add Package Dependency...
- Paste the repository URL (
https://github.com/0xWDG/GameControllerKit) and click Next. - Click Finish.
Usage
import SwiftUI
import GameControllerKit
struct ContentView: View {
/// The game controller kit
@State
var gameController = GameControllerKit()
/// Log
@State
var log: [String] = []
var body: some View {
VStack {
Button {
gameController.set(color: .GCKRandom)
} label: {
Text("Random Color")
}
Text("Controller: \(gameController.controller?.productCategory ?? "None"), " +
"\((gameController.controllerType ?? .generic).description)")
Text("Last action:\n\(String(describing: gameController.lastAction)).")
GCKControllerView()
.environmentObject(gameController)
List {
ForEach(log.reversed(), id: \.self) { text in
Text(text)
}
}
}
.padding()
.onAppear {
gameController.set(handler: handler)
UIApplication.shared.isIdleTimerDisabled = true
}
}
/// Handler
///
/// - Parameters:
/// - action: action
/// - pressed: is the button pressed?
/// - controller: which controller?
public func handler(
action: GCKAction,
pressed: Bool,
controller: GCKController
) {
log.append(
"\(String(describing: action))(\(action.position.arrowRepresentation)) \(pressed ? "Pressed" : "Unpressed"), " +
"Controller #id \(String(describing: controller.playerIndex.rawValue))"
)
if action == .buttonA && pressed {
// set to a random color
gameController.set(color: .GCKRandom)
}
}
}Image of Usage Demo App
iOS
[C65552DF-04CC-493E-AD73-C385A7CEC53C]
MacOS
<img width="1012" alt="AA801C52-88A1-4326-A5DC-3A04DF491077" src="https://github.com/user-attachments/assets/f6eaa752-fdda-4ddd-8eeb-acbc9797dc94">
tvOS
[Screenshot 2024-08-29 at 14 43 51]
Mentions
- Touch-free Touch Screens by Rob Whitaker
https://appdevcon.nl/session/touch-free-touch-screens/ @ AppDevCon 2025 https://www.youtube.com/watch?v=bHPMuVyjBYw @ iOSKonf25
Contact
π¦ @0xWDG π mastodon.social/@0xWDG π¦ @0xWDG π§΅ @0xWDG π wesleydegroot.nl π€ Discord
Interested learning more about Swift? Check out my blog.
Package Metadata
Repository: 0xWDG/GameControllerKit
Homepage: https://0xwdg.github.io/GameControllerKit/
Stars: 37
Forks: 3
Open issues: 1
Default branch: main
Primary language: swift
License: MIT
Topics: 0xwdg, controller, dualsense, dualshock, game, game-development, gamedev, gamedevelopment, games, hacktoberfest, ios, macos, playstation, spm, stadia, swift, swiftlang, switch, tvos, xbox
README: README.md