Create apps that allow players to interact with each other using GameKit.

GameKit Documentation

Posts under GameKit tag

84 Posts
Sort by:
Post marked as solved
2 Replies
372 Views
Hello, I am building an app that requires players joined to an online game session and to have a video chat with both of their front cameras turned on. I currently know that GameKit supports the voice chat option but could not find any source for video chat. Is it possible set up a video chat on an online game session?. What libraries can I use that have support in implementing the video chat (AVFoundation) ? Your assistance is greatly appreciated.
Posted
by
Post not yet marked as solved
0 Replies
272 Views
GKLocalPlayer.local.authenticateHandler = {viewController, error in When authenticating a player using authenticateHandler, the completion handler is only called if the player is already logged in. If the player is not logged in, the authentication window will appear but the completion handler is never called. If I have content in a volumetric window that obscures the login window (which appears at a slight Z increase from the parent window), what can I do? If the completion handler was being called then I could make adjustments to my view, but it never gets called if the user is not already logged in. https://developer.apple.com/documentation/gamekit/authenticating_a_player Thanks.
Posted
by
Post not yet marked as solved
0 Replies
448 Views
I am on a MacBook Pro 2023. 16inch, 16gb ram, 1tb drive. I am on the latest MacOs (Sonoma 14.3.1) and using the steps from the Apple Gaming Wiki to download the Game Porting Toolkit. I have met all the requirements. I tried using the automated installer, didn't work. I tried doing homebrew, and it worked all up until I got to the step where I had to run the command to download Apple tap: brew tap apple/apple http://github.com/apple/homebrew-apple I get this error: Logs: /Users/MYNAME/Library/Logs/Homebrew/game-porting-toolkit/00.options.out /Users/MYNAME/Library/Logs/Homebrew/game-porting-toolkit/01.configure /Users/MYNAME/Library/Logs/Homebrew/game-porting-toolkit/01.configure.cc /Users/MYNAME/Library/Logs/Homebrew/game-porting-toolkit/02.make /Users/MYNAME/Library/Logs/Homebrew/game-porting-toolkit/wine64-build If reporting this issue please do so to (not Homebrew/brew or Homebrew/homebrew-core): apple/apple
Posted
by
Post not yet marked as solved
1 Replies
353 Views
I'm putting together a group of achievements on Game Center for my new game. From what I read, you must just adjust the "Percent Complete" when reporting updates on an achievement. However, you can only use whole numbers when doing that. So, how would one update a single "unit" to an achievement that needs 1,000 units to achieve? Any suggestions would be very helpful. Thanks!
Posted
by
Post not yet marked as solved
1 Replies
1.3k Views
I tried twice to install homebrew and I got a error message twice: Error: apple/apple/game-porting-toolkit 1.1 did not build Logs: /Users/omarzunun/Library/Logs/Homebrew/game-porting-toolkit/00.options.out /Users/omarzunun/Library/Logs/Homebrew/game-porting-toolkit/01.configure /Users/omarzunun/Library/Logs/Homebrew/game-porting-toolkit/01.configure.cc /Users/omarzunun/Library/Logs/Homebrew/game-porting-toolkit/02.make /Users/omarzunun/Library/Logs/Homebrew/game-porting-toolkit/wine64-build If reporting this issue please do so to (not Homebrew/brew or Homebrew/homebrew-core): apple/apple
Posted
by
Post not yet marked as solved
0 Replies
284 Views
I'm trying to establish a connection between two devices using mobile network. The config in both devices are ok allowing use mobile data for the app. I'm able to connect and start the game with WIFI networ `// Initiate matchmaking - (void)initiateMatchmakingWithViewController:(UIViewController*)rustViewController { dispatch_async(dispatch_get_main_queue(), ^{ if (![GKLocalPlayer localPlayer].isAuthenticated) { NSLog(@"Player is not authenticated."); return; } NSLog(@"Preparing MatchMaker"); GKMatchRequest *request = [[GKMatchRequest alloc] init]; request.minPlayers = 2; request.maxPlayers = 2; GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithMatchRequest:request]; mmvc.matchmakerDelegate = self; // Use the passed view controller to present the matchmaking UI [rustViewController presentViewController:mmvc animated:YES completion:nil]; NSLog(@"MatchMaker running...."); // Store the rustViewController for later, to revert back to it originalViewController = rustViewController; }); } // GKMatchmakerViewControllerDelegate methods - (void)matchmakerViewControllerWasCancelled:(GKMatchmakerViewController *)viewController { [originalViewController dismissViewControllerAnimated:YES completion:nil]; NSLog(@"Matchmaking was cancelled."); } - (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFailWithError:(NSError *)error { [originalViewController dismissViewControllerAnimated:YES completion:nil]; NSLog(@"Matchmaking failed with error: %@", error.localizedDescription); } - (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match { [originalViewController dismissViewControllerAnimated:YES completion:nil]; self.currentMatch = match; match.delegate = self; NSLog(@"Match found."); // Fetch details for each player in the match NSMutableArray<NSString *> *playerIDs = [NSMutableArray array]; for (GKPlayer *player in match.players) { [playerIDs addObject:player.playerID]; } [GKPlayer loadPlayersForIdentifiers:playerIDs withCompletionHandler:^(NSArray<GKPlayer *> *players, NSError *error) { if (error) { NSLog(@"Error retrieving player details: %@", error.localizedDescription); return; } for (GKPlayer *player in players) { if (![player.playerID isEqualToString:GKLocalPlayer.localPlayer.playerID]) { [self loadAndStoreAvatarForRemotePlayer:player]; } } }]; }` I can see how both clients are in state "connecting" but the log "Match found." it's never set. I also can see this log "[Match] syncPlayers failed to loadPlayersForLegacyIdentifiers"
Posted
by
Post not yet marked as solved
0 Replies
285 Views
In a SwiftUI game using a UIViewControllerRepresentable; When presenting a GKTurnBasedMatchmakerViewController view with showExistingMatches set to true, sometimes the Invite view is presented and not the existing matches, dismissing it or even inviting someone does not stop it from presenting the next time it's called. Sometimes logging out and of Game Center and back in fixes it other times a restart of the device is required. typealias ViewControllerRepresentable = UIViewControllerRepresentable struct GameCenterView: ViewControllerRepresentable { ... // Creates a new view controller func makeUIViewController(context: Context) -> GKTurnBasedMatchmakerViewController { let request = GKMatchRequest() request.minPlayers = 2 request.maxPlayers = 2 request.inviteMessage = "Would you like to play a game of X?" request.defaultNumberOfPlayers = 2 let viewController = GKTurnBasedMatchmakerViewController(matchRequest: request) viewController.showExistingMatches = true viewController.turnBasedMatchmakerDelegate = context.coordinator return viewController } ...
Posted
by
Post not yet marked as solved
0 Replies
321 Views
I'm working in a game where I integrate matchmaker and it's working fine when I try with two devices under same wifi network, but in the moment I use 5g mobile network and I do the matchmaker, I can still see each other but the game did not start and I see error sending data to the remote player. The game is not yet published and I'm using TestFlight for the clients.
Posted
by
Post marked as solved
1 Replies
350 Views
I'm trying to implement multiplayer invitation from game center for macos, ios, tvos following this https://developer.apple.com/documentation/gamekit/finding_multiple_players_for_a_game?language=objc Implementation works for tvos and ios, I can invite my friends, Start Game and continue sending data. But macos still doesn't work at all. I tried using build that works on iOS to invite macos player, but my mac cannot even receive the invitation notification from game center (game is installed already on mac). While from mac, my invitation process is stuck here until it's failed Is there any specific setting on macos to enable game center invitation?
Posted
by
Post not yet marked as solved
5 Replies
1.3k Views
Hi all! My new iOS app (first one in Swift and SpriteKit, was using ObjectiveC and Cocos2D before, a few years back) - got rejected with the dreaded "We were unable to review your app as it crashed on launch.", That's especially bad news when it never ever crashed on any on our devices when testing (variety of phones, iPads and all sort of iOS) either in debug or release, before submission. So no luck repro-ing! The crashlog text file apple review team sent back, renamed as .crash, seems to open in Xcode (right click on it) when linked to the right project and seems to point in the leaderboard code fetching the local authenticated user's score. This is some code that I shamelessly copy/pasted from a StackOverflow page a few months ago, and seemed to work right away so moved-on back then, but something must be unsafe in there (sorry, bit of a rookie with Swift optionals etc). Any help would be much appreciated as this code seems to work fine in debug, without warnings or anything, and also works fine in release using TestFlight - so we simply cannot repro the apple QA issue, and we need to fix it blind! This is the function below that is crashing, right on the line that has the "{ player, _, _ in ": func sync_hiscore() { if (GKLocalPlayer.local.isAuthenticated) { if #available(iOS 14.0, *) { GKLeaderboard.loadLeaderboards( IDs: ["HatStacker_LD01"] ) { leaderboards, _ in leaderboards?[0].loadEntries( for: [GKLocalPlayer.local], timeScope: .allTime ) { player, _, _ in // &lt;&lt;&lt;&lt; !!! CRASHES HERE!! if ( player!.score &gt; player_hiscore) { player_hiscore = player!.score } } } } } } I've also attached the full crashlog if that's of any help! Many thanks all, sorry for such a Swift rookie question, but to add to the confusion this is also the first time one of our apps gets rejected for such an obvious bad crash at launch, that no one has seen during our weeks of testing! Any idea why it's only in release and only in the apple HQ/review env that we get that error? Could they have an invalid Game Center account that is confusing the "player" score fetching? Cheers, JBB HatStacker_build4.crash
Posted
by
Post not yet marked as solved
0 Replies
379 Views
In our multiplayer game prototype, we experience a ping of 300 ms (at best) when using Game Center and GKMatch to send data between players, over the GKMatch.SendDataMode.unreliable channel. This latency is not suitable for a real-time game. When we tested alternative services like Unity's Relay under identical conditions (location, devices, and Wi-Fi), we achieved a ping of 120 ms. Is a ping value of 300 ms typical when using Game Center? I can think of possible reasons in case it's not typical, but I can't be sure: Is there a different behavior (servers relaying peer-to-peer connections) when the game is not yet released on the store? We're in Europe, maybe this is normal in Europe and better in US?
Posted
by
Post marked as solved
1 Replies
349 Views
I'm working in a game that it was working perfectly with Game Center (remote game with 1 remote player), but since last Sunday I'm having errors when I try to start a remote game. I have 2 errors, one says FAILED when I invite a friend to play. In this case, the other device never gets the notification. The other error sent the notification, but when I tap on it (on the other device), it fails saying that it couldn't communicate with the server). The main device it says "INVITED" but it doesn't say anything else. I haven't found anyone else having the same issue, so I wonder if it's my fault, although I haven't change that part of the code since the last time I tested it. Is it someone else here having similar problems? or knows what should I review? thank you all, and have a great year!
Posted
by
Post not yet marked as solved
1 Replies
691 Views
I'm trying to display the native GameCenter interface from Unity (I've already tried Bounded and Unbouded Volume Mode, that is, with and without Full Immersive Mode) but I can't display this interface. If I use Unity's SocialAPI (https://docs.unity3d.com/ScriptReference/Social.ShowLeaderboardUI.html), nothing is displayed, and I get the following message in XCode (simulator): [u 9C225095-F55E-42CC-8136-957279631DF3:m (null)] [com.apple.GameCenterUI.GameCenterDashboardExtension(1.0)] Connection to plugin interrupted while in use. setViewControllers:animated: called on <GKGameCenterViewController 0x106825600> while an existing transition or presentation is occurring; the navigation stack will not be updated. Type: Notice | Timestamp: 2023-12-08 12:13:50.585973+01:00 | Process: leaderboard-test | Library: UIKitCore | TID: 0x3e57bd viewServiceDidTerminateWithError:: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted} Type: Notice | Timestamp: 2023-12-08 12:13:50.586997+01:00 | Process: leaderboard-test | Library: UIKitCore | TID: 0x3e57bd [u 9C225095-F55E-42CC-8136-957279631DF3:m (null)] [com.apple.GameCenterUI.GameCenterDashboardExtension(1.0)] Connection to plugin invalidated while in use. Type: Error | Timestamp: 2023-12-08 12:13:50.588393+01:00 | Process: leaderboard-test | Library: PlugInKit | Subsystem: com.apple.PlugInKit | Category: lifecycle | TID: 0x3e5a18 If I try to do it using Apple's plugin for GameCenter (GameKitWrapper) adapted to VisionOS, the application crashes with the following error: "Presentations are not permitted within volumetric window scenes." *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Presentations are not permitted within volumetric window scenes.' *** First throw call stack: ( 0 CoreFoundation 0x00000001804a510c __exceptionPreprocess + 172 1 libobjc.A.dylib 0x0000000180082f50 objc_exception_throw + 56 2 UIKitCore 0x0000000184bc2798 -[UIViewController _presentViewController:withAnimationController:completion:] + 1136 3 UIKitCore 0x0000000184bc4000 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 88 4 UIKitCore 0x0000000184bc42d0 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 484 5 UIKitCore 0x0000000184bc3f6c -[UIViewController _presentViewController:animated:completion:] + 160 6 UIKitCore 0x0000000184bc4374 -[UIViewController presentViewController:animate *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Presentations are not permitted within volumetric window scenes.' *** First throw call stack: ( 0 CoreFoundation 0x00000001804a510c __exceptionPreprocess + 172 1 libobjc.A.dylib 0x0000000180082f50 objc_exception_throw + 56 2 UIKitCore 0x0000000184bc2798 -[UIViewController _presentViewController:withAnimationController:completion:] + 1136 3 UIKitCore 0x0000000184bc4000 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 88 4 UIKitCore 0x0000000184bc42d0 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 484 5 UIKitCore 0x0000000184bc3f6c -[UIViewController _presentViewController:animated:completion:] + 160 6 UIKitCore 0x0000000184bc4374 -[UIViewController presentViewController:animated:completion:] + 140 7 GameKitWrapper 0x00000001057aa864 $s14GameKitWrapper34GKGameCenterViewController_Present7pointer6taskId9onSuccessySv_s5Int64VyAGXCtF ... ) The code that produces this crash is the following (trying to display the GameCenter UI): let viewController = UIApplication.shared.windows.first!.rootViewController; viewController?.present(target, animated: true); @_cdecl("GKGameCenterViewController_Present") public func GKGameCenterViewController_Present ( pointer: UnsafeMutableRawPointer, taskId: Int64, onSuccess: @escaping SuccessTaskCallback ) { let target = Unmanaged<GKGameCenterViewController>.fromOpaque(pointer).takeUnretainedValue(); _currentPresentingGameCenterDelegate = GameKitUIDelegateHandler(taskId: taskId, onSuccess: onSuccess); target.gameCenterDelegate = _currentPresentingGameCenterDelegate; #if os(iOS) || os(tvOS) || os(visionOS) let viewController = UIApplication.shared.windows.first!.rootViewController; viewController?.present(target, animated: true); #endif } Is there a way to present the GameCenter UI overlaid on the Unity app?
Posted
by
Post not yet marked as solved
0 Replies
323 Views
Hello, I'm working on a game application and I've been wondering about how I can separate the GameKit Leaderboards I'm using for testing purpose and the ones that would be "live" (i.e: only for the users) I've been point out that I can attach leaderboards to an app version but it makes me wondering about compatibility. I'm working on the application in version 1.1. My users are using the application in version 1.0 (with their leaderboards). Then I'm releasing a version 1.2. It would means I need to attach all the leaderboards from version 1.0 to version 1.2 and to me it's very tedious. What would be the best practice with using leaderboards on multiple environments? Thanks
Posted
by
Post not yet marked as solved
0 Replies
341 Views
The documentation for how to handle focus & triggering the GKAccessPoint seems to be outdated for tvOS: https://developer.apple.com/documentation/gamekit/adding_an_access_point_to_your_game For tvOS specifically, the documentation has examples that refer to GKAccessPoint.focusFeedback and GKAccessPoint.shared.triggerAccessPoint which don't exist. I can use shared.isFocused() instead of .focusFeedback(), and .trigger {} instead of .triggerAccessPoint {}, but then it seems I can either set the focus to the accessPoint or I can trigger it, but I can't do both. For example, the following code captures the focus via a button, and then redirects the focus to the GKAccessPoint. You can still press the tvOS remote to visually show the button pressing, but it never prints out anything or triggers the access point. If you remove the .focusable(true) {...} section at the end, then the button will trigger the accessPoint, but it won't show it as focused. I seem to be missing something! Any ideas? #if os(tvOS) // this is used to "capture" focus invisibly, so it can be handed off to Game Center's GKAccessPoint VStack(alignment: .leading, content: { Button("") { print("Button representing GKAccessPoint was pressed!") GKAccessPoint.shared.trigger { print("\nI WAS TRIGGERED!!! by a button\n") } } .focusable(true) { isFocused in if isFocused { print("focused!") GKAccessPoint.shared.isFocused = true } else { GKAccessPoint.shared.isFocused = false print("NOT focused!") } } .opacity(0.1) }) .focusSection() #endif
Posted
by
Post not yet marked as solved
3 Replies
685 Views
Hi everyone, I'm trying to implement matchmaking in visionOS using GameKit and GameCenter. I'm following the example project that been shared but I get an error. Error: The requested operation could not be completed because you are not signed in to iCloud.. I'm getting this error as a result of matchmaking. I'm already logged in to iCloud in Vision Pro Simulator. I've tried to switch off-on every related settings but didn't work. I'm using latest Xcode Dev Beta and visionOS Beta v6. Would you mind share me any workaround? Regards, Melih
Posted
by
Post not yet marked as solved
0 Replies
342 Views
I am trying to test game center multiplayer with the IOS simulator and my physical phone. I can get it working between 2 physical phones but whenever I try with the simulator it shows the error Failed to find players. I have seen people use the simulator before to test multiplayer. I have tried both my account and a sandbox account with no luck. Is there something I am missing or doing wrong? I am using gamekit to make this app. Thanks
Posted
by
Post not yet marked as solved
5 Replies
636 Views
I attempted to use the new App Store Connect API 3.0 feature to manage Game Center achievements. My goal was to create a bunch of achievements, with one en-US localization each, with an attached image. Creating the achievement and its localization initially seems to have worked fine; I uploaded the image, and its assetDeliveryState.state is COMPLETED. But when I visit the achievement in the App Store Connect Console UI, all the images I've uploaded are 404 Not Found. I'm going to have to upload all of these images by hand. 😭 Here's the sample code I used, using the https://github.com/dfabulich/node-app-store-connect-api v5.0.3. import { api } from 'node-app-store-connect-api'; import { readFile, stat } from 'node:fs/promises'; import { homedir } from 'node:os'; const appId = 6468677114; const vendorIdentifier = 'com.example.myachievement'; const showBeforeEarend = true; const points = 10; const locale = "en-US"; const title = "My Achievement"; const afterEarnedDescription = "Earned the achievment."; const beforeEarnedDescription = "Earn the achievement."; const fileName = `${vendorIdentifier}.png`; const params = { issuerId: "69a6de6f-0d6d-47e3-e053-5b8c7c11a4d1", apiKey: "3S3G8T48YW", }; params.privateKey = await readFile(`${homedir()}/.appstoreconnect/private_keys/AuthKey_${params.apiKey}.p8`, 'utf8'); const { read, create, uploadAsset, pollForUploadSuccess } = await api(params); const {data: gameCenterDetail} = await read(`apps/${appId}/gameCenterDetail`); console.log('creating', vendorIdentifier); const gameCenterAchievement = await create({ type: 'gameCenterAchievements', attributes: { referenceName: title, vendorIdentifier, points, repeatable: false, showBeforeEarned, }, relationships: { gameCenterDetail } }); console.log(' localization'); const gameCenterAchievementLocalization = await create({ type: 'gameCenterAchievementLocalizations', attributes: { locale, name: title, afterEarnedDescription, beforeEarnedDescription, }, relationships: { gameCenterAchievement } }); console.log(' image'); const image = await create({ type: 'gameCenterAchievementImages', attributes: { fileName, fileSize: (await stat(fileName)).size, }, relationships: { gameCenterAchievementLocalization } }); console.log(' upload'); await uploadAsset(image, await readFile(fileName)); console.log(' poll'); await pollForUploadSuccess(image.links.self);
Posted
by