我制作了一款可以通过蓝牙和 bonjour 运行的 iOS 游戏。两种方式都很好用,但如果玩家可以通过任何互联网连接(无论是边缘、3G 还是不同的 wi-fi 地址)互相玩游戏,我真的很喜欢。
问题是:我没有资源或知识来设置专用服务器或类似的东西。看来 GameKit 中肯定有一些东西可以让我做到这一点,但尽管上周花了几十个小时弄清楚如何使用它,但我什么也没发现。
那么,有人有解决方案的想法吗?我的游戏只是一对一的,如果这能让事情变得更容易的话。
我正在创建类似于支持Game Center的游戏.当玩家正确认证游戏中心但在我想报告我的分数时网络(wifi或手机)不可用时,我在向排行榜报告得分时遇到问题.
我的应用程序适用于iOS 5.0及更高版本,根据文档 - 排行榜 - 它应该像他们说的那样工作 - 我只使用该功能
- (void)reportScoreWithCompletionHandler:(void (^)(NSError *error))completionHandler and
Run Code Online (Sandbox Code Playgroud)
和
如果由于某种原因由于网络错误而无法报告分数,则Game Kit会在网络可用时自动重新发送数据.
但是当我关闭wifi,玩这个游戏并在这个离线模式下报告分数时,我的分数在我重新上线时没有报告!:(与我的成就相同的问题.是否有任何技巧或已知问题?或者此功能仅适用于实时应用而不是测试?
非常感谢你.
我使用以下代码来发布通知,但它因 EXC_BAD_ACCESS 而崩溃:
[[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil];
Run Code Online (Sandbox Code Playgroud)
在我的 Constants.h 文件中:
#import <Foundation/Foundation.h>
extern NSString *const PLAYER_ID;
extern NSString *const RANDOM_NUMBER;
extern NSString *const AUTHENTICATED_NOTIFICATION;
extern NSString *const UNAUTHENTICATED_NOTIFICATION;
@interface RIYConstants : NSObject
{
}
@end
Run Code Online (Sandbox Code Playgroud)
在我的 Constants.m 文件中
#import "RIYConstants.h"
NSString *const PLAYER_ID = @"playerId";
NSString *const RANDOM_NUMBER = @"randomNumber";
NSString *const AUTHENTICATED_NOTIFICATION = @"AUTHENTICATED_NOTIFICATION";
NSString *const UNAUTHENTICATED_NOTIFICATION = @"UNAUTHENTICATED_NOTIFICATION";
@implementation RIYConstants
@end
Run Code Online (Sandbox Code Playgroud)
崩溃的方法是游戏中心验证时调用的处理程序:
-(void)authenticatedPlayer:(GKLocalPlayer*)localPlayer
{
[[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil];
......
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它会崩溃。每次发布通知时它都不会崩溃(似乎是随机的)。
编辑:只有一个对象注册接收通知。下面是 init 方法和调用的选择器。我认为没有任何事情会导致崩溃。_label 和 _joinGame 都是 SKLabelNodes
-(id)init
{ …Run Code Online (Sandbox Code Playgroud) 我正在开发一款游戏,我正在寻找帮助或代码,以便在用户单击按钮时在我的应用程序中显示 GameCenter 排行榜。我不知道从哪里开始,因为所有其他答案似乎都是针对 Obj-C 的,谢谢!
编辑:下面的答案工作得很好,但是对于那些想知道如何在 SpriteKit 中执行此操作的人,只需将以下方法GameViewController添加到并添加一个通知中心观察者
NSNotificationCenter.defaultCenter().addObserver(self, selector: "showLeaderboard", name: "showLeaderboard", object: nil)
Run Code Online (Sandbox Code Playgroud)
在您的SKScene班级中,只需调用该观察者即可。
NSNotificationCenter.defaultCenter().postNotificationName("showLeaderboard", object: nil)
Run Code Online (Sandbox Code Playgroud)
只是为了帮助那些疑惑的人!
gamekit game-center sprite-kit game-center-leaderboard swift
我正在尝试邀请附近的玩家参加比赛,但邀请函要么从未发送过,要么从未收到过.
GKMatchMaker startBrowsingForNearbyPlayersWithHandler工作并返回相同wifi上的附近玩家,但之后我使用findMatchForRequest并返回没有任何玩家的匹配,我尝试邀请的玩家永远不会收到邀请通知.这是我的代码.
我首先验证本地播放器:
GKLocalPlayer.localPlayer.authenticateHandler= ^(UIViewController *controller, NSError *error)
{
if (error)
{
NSLog(@"%s:: Error authenticating: %@", __PRETTY_FUNCTION__, error.localizedDescription);
return;
}
if(controller)
{
// User has not yet authenticated
[pViewController presentViewController:controller animated:YES completion:^(void)
{
[self lookForNearbyPlayers];
}];
return;
}
[self lookForNearbyPlayers];
};
-(void)lookForNearbyPlayers
{
if(!GKLocalPlayer.localPlayer.authenticated)
{
NSLog(@"%s:: User not authenticated", __PRETTY_FUNCTION__);
return;
}
Run Code Online (Sandbox Code Playgroud)
我将我的视图控制器注册为GKLocalPlayerListener的委托:
[GKLocalPlayer.localPlayer registerListener:self]; // self is a view controller.
// This works. My test local player which is a second device and appleID I setup shows up …Run Code Online (Sandbox Code Playgroud) 我有一个完整的 Sprite Kit 游戏,它本身很可靠,但是我真的很想将实时多人游戏功能融入其中。唯一的问题是我找不到任何教程来说明如何做到这一点(raywenderlich.com 有一个,但它是使用 Objective-C 的,而我的游戏是用 Swift 编写的)。
我已经通读了苹果的文档,但是,它实际上只是涵盖了正在发生的事情的逻辑,并列出了所使用的部分,而不是实际展示如何实现代码。
我想知道是否有人可以帮助我如何实际实施代码。从我通过搜索可以看出,这是一个非常受欢迎的主题,但没有任何关于使用 swift 的教程。
我有以下代码可以在我的 SwiftUI 应用程序中对 Game Center 中的本地玩家进行身份验证。如果玩家尚未登录,我希望 Game Center 提示用户登录,但这不会发生。
class AppSettings: UINavigationController {
func authenticateUser() {
let localPlayer = GKLocalPlayer.local
localPlayer.authenticateHandler = { vc, error in
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?我还阅读了关于在我班级的某处使用 UIViewControllerRepresentable 将 UIKit 的 ViewController 集成到 SwiftUI 中的内容,但我不明白如何使用它。有人可以帮我吗?
gamekit game-center swift swiftui uiviewcontrollerrepresentable
Apple声明,如果您想报告GKAchievement但是您遇到网络错误,处理此问题的最佳方法是保存GKAchievement(可能将其添加到阵列中),然后定期尝试报告成就.
保存成就的最佳地点是什么?NSUserDefaults会满足,还是财产清单会更好?
我应该何时以及何时尝试举报?在应用程序启动时,或每10分钟一次?
可能重复:
游戏中心无法识别游戏
我知道这已被问过几次,但其他线程中的解决方案,例如从模拟器中删除应用程序并重新安装对我来说不起作用.
我的info.plist中的软件包ID与iTunes Connect中的ID匹配,我已在ITC中正确设置了一个测试应用程序.
我获得此警报的唯一方法是将gamekit设置为info.plist的UIRequiredDeviceCapabilities键中的要求.根据Apple的文档,只有在GameKit是应用程序运行的要求且不需要与Game Center集成时才应设置此项.
有什么想法会发生这种情况吗?
我得到错误:
错误域= GKErrorDomain代码= 27“由于您尚未登录iCloud,所以无法完成请求的操作” UserInfo = 0x1889f160 {NSLocalizedDescription =由于您尚未登录iCloud,所以无法完成请求的操作}
当我尝试使用以下明显的代码保存游戏数据时:
[[GKLocalPlayer localPlayer] saveGameData:serializedData withName:@"SaveName" completionHandler:^(GKSavedGame *savedGame, NSError *error) {
if (savedGame != nil) {
NSLog(@"Player data saved to GameCenter: %@", savedGame);
} else {
NSLog(@"Player data NOT saved to GameCenter, error: %@", error.description);
}
}];
Run Code Online (Sandbox Code Playgroud)
更为奇怪的是,它已经在两个星期前生效了,所以我将其注释掉并开始编写其他内容:排行榜,应用内购买–以及所有这些工作。
我正在登录到Game Center和iCloud的iPhone(iOS 8.1.3)上对其进行测试,我已打开iCloud Drive,但无法保存。我什至设置了一个新的测试帐户,但结果相同。
是否可以在同一测试帐户上测试所有这些功能,否则会导致此问题,还是该联系Apple了?
gamekit ×10
game-center ×7
ios ×6
objective-c ×3
swift ×3
achievements ×2
iphone ×2
sprite-kit ×2
center ×1
icloud ×1
ios9 ×1
leaderboard ×1
p2p ×1
swiftui ×1