我想使用GKSession连接两个设备,一个作为服务器启动,另一个作为客户端启动.使用此配置,我无法使用GKPeerPickerController.
我在连接两台设备时遇到问题:
在接口文件中我有
GKSessionDelegate
GKSession *session;
Run Code Online (Sandbox Code Playgroud)
在实现中,我使用以下代码启动服务器:
session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeClient];
session.delegate = self;
session.available = YES;
Run Code Online (Sandbox Code Playgroud)
客户端开始使用此代码:
session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeServer];
session.delegate = self;
session.available = YES;
Run Code Online (Sandbox Code Playgroud)
我如何强制使用蓝牙而不是WiFi?
我也实现了这些调用:
-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
NSLog(@"Someone is trying to connect");
}
- (BOOL)acceptConnectionFromPeer:(NSString *)peerID error:(NSError **)error {
NSLog(@"acceptConnectionFromPeer");
}
Run Code Online (Sandbox Code Playgroud)
当我开始时,我将其纳入调试器:
Listening on port 50775
2010-02-19 14:55:02.547 iFood[3009:5103] handleEvents started (2)
Run Code Online (Sandbox Code Playgroud)
当其他设备开始查找时,我得到了这个:
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 name=00eGs1R1A..Only by Audi …Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用 Game Center 的 iPhone 游戏,我很难理解如何开始一个通过收到朋友的邀请开始的比赛游戏。该文档说,这...
当应用程序直接从另一个玩家收到邀请时,acceptedInvite 参数非零。在这种情况下,其他玩家的应用程序已经创建了匹配请求,因此您的应用程序的这个副本不需要创建一个。
据此,我不需要创建匹配请求,因为进行邀请的玩家已经创建了一个。如果是这样,我如何获取向/从其他玩家发送/接收数据所需的 GKMatch 对象?我知道获取 GKMatch 对象的唯一方法是创建一个匹配请求并调用该findMatchForRequest方法,文档说我不应该这样做。
他们为此拥有的唯一代码示例涉及创建和使用GKMatchmakerViewController,我无法使用它,因为我正在创建自己的自定义视图。
非常感谢你的智慧!
有没有办法从GKTurnBasedParticipant对象中检索玩家的名字?根据班级参考,除了丑陋的玩家ID之外,似乎无法显示有关游戏玩家的相关信息.或者我错过了什么?
谢谢...
你们知道任何教程或代码示例,包括使用iOS 7上的Game Center创建实时比赛吗?
所有Apple示例代码均来自2011(!),他们的文档不完整且含糊不清,并且还在谈论iOS 6.我在网上找到的所有教程都是针对iOS 6的,它们不包括实时匹配.显然苹果并不关心这一点.
有什么建议吗?
我正在尝试通过下一个代码将游戏数据保存到iCloud:
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer saveGameData:[NSData dataWithBytes:rawData->data() length:rawData->size()]
withName:[NSString stringWithUTF8String:fileName.c_str()]
completionHandler:^(GKSavedGame *savedGame, NSError *error) {
if (error == nil) {
DebugLog(@"Snapshot successfully saved");
} else {
DebugLog(@"saveSnapshot error: %@", error.description);
}
}];
Run Code Online (Sandbox Code Playgroud)
但收到错误消息: The requested operation could not be completed because you are not signed in to iCloud
我试过在iOS模拟器和设备上做这个但是没有成功.
并尝试使用测试苹果ID,开发苹果ID,新苹果ID,但也没有成功.
用户在iOS设置中登录iCloud并登录到Game Center.
有什么建议?
我试图将GKGraphNode2D子类化为包含不同地形的不同惩罚(在costToNode方法中).当我用新的子类数组创建一个新的GKGraph并在GKGraph上调用findPathFromNode时,它会完全忽略我的costToNode方法.
代码如下:
public class PenaltyGraphNode: GKGraphNode2D {
public let penalty: Float
init(position: CGPoint, penalty: Float) {
self.penalty = penalty
let point = vector_float2(Float(position.x), Float(position.y))
super.init(point: point)
}
override public func costToNode(node: GKGraphNode) -> Float {
guard let penaltyNode = node as? PenaltyGraphNode else { return super.costToNode(node) }
return super.costToNode(node) * (1 + penaltyNode.penalty)
}
}
Run Code Online (Sandbox Code Playgroud)
我试图使用GKGraph(为了简洁起见删除了节点创建):
let penaltyNodes: [PenaltyGraphNode] = [penaltyNode1, penaltyNode2, ...]
let graph = GKGraph(nodes: penaltyNodes)
let path = graph.findPathFromNode(startNode, toNode: endNode) as? [PenaltyGraphNode]
Run Code Online (Sandbox Code Playgroud)
我的子类中的costToNode永远不会被调用,我确保我在图中创建并稍后添加到它的所有节点都是PenaltyGraphNodes,但它仍然不会调用costToNode.当我打印图形的nodes属性时,它只显示为GKGraphNode2D对象,而不是我的子类.
我错过了一些明显的东西吗?
我在我的iOS游戏中实现了GameKit,包括保存的游戏功能.
这是我如何保存和加载游戏的示例:
MobSvcSavedGameData.h
#ifndef MOBSVC_SAVEDGAMEDATA_H
#define MOBSVC_SAVEDGAMEDATA_H
#import <Foundation/Foundation.h>
@interface MobSvcSavedGameData : NSObject <NSCoding>
@property (readwrite, retain) NSString *data;
+(instancetype)sharedGameData;
-(void)reset;
@end
#endif /* MOBSVC_SAVEDGAMEDATA_H */
Run Code Online (Sandbox Code Playgroud)
MobSvcSavedGameData.m
#import "MobSvcSavedGameData.h"
#import <Foundation/Foundation.h>
@interface MobSvcSavedGameData () <NSObject, NSCoding>
@end
@implementation MobSvcSavedGameData
#pragma mark MobSvcSavedGameData implementation
static NSString * const sgDataKey = @"data";
+ (instancetype)sharedGameData {
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (void)reset
{
self.data = nil;
}
- …Run Code Online (Sandbox Code Playgroud) 我正在开发一个小型文字游戏作为业余项目,并选择 Flutter 来发布适用于 Android 和 iOS 的游戏。我可以使用 flutter 包(例如https://pub.dev/packages/games_services)与 Google Play Games 和 Apple Game Kit 集成,但我认为这不允许创建跨平台排行榜,但 iOS 和Android 玩家可以看到他们各自的分数。
我找到的选项:
在我开始使用 Fire Base 创建简单的评分/排行榜之前,我希望在这里找到也对此进行研究的人。有没有办法既使用 Google 和 Apple 服务,又查看统计 x 平台?我更喜欢这个,也希望能给用户带来更综合的体验,或许还能通过这个获得新用户。
感谢您的指点。
我有一个只包含这个的应用程序:
- (void)viewDidLoad
{
[super viewDidLoad];
//Authenticate Local GameCenter player
[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error)
{
[GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
{
}];
}];
}
Run Code Online (Sandbox Code Playgroud)
马上,我得到了大量的泄漏.难道我做错了什么?我用ARC.

我正试图让GameKit使用本地配对[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:].基本上,我正在尝试实现无接口的本地匹配:只要我本地附近有一个玩家,我想连接并开始匹配.重要的是,我只是想为本土球员做到这一点:我从来没有想在互联网上自动匹配.
我在iTunes iTunes中为我的应用启用了Game Center,并在我用来测试的每台设备上注册了一个不同的沙盒帐户.
我尝试了两种配对GKMatchmakerViewController(在验证本地播放器之后)和程序化配对startBrowsingForNearbyPlayersWithReachableHandler:,在iPhone 4和第四代iPod Touch上运行相同的代码在我的桌面上彼此相邻.都没有找到另一个; 当使用GKMatchmakerViewController界面寻找附近的球员仍然在
寻找玩家......
微调器,使用时startBrowsingForNearbyPlayersWithReachableHandler:,通知块永远不会被调用.
这是我目前的测试代码块:
-(void)connectLocal
{
if( ![GKLocalPlayer localPlayer].isAuthenticated )
{
// authenticateLocalPlayer calls connectLocal again after authentication is complete
[ self authenticateLocalPlayer ];
return;
}
[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) {
NSLog(@"Reachability changed for player %@", playerID );
} ];
}
Run Code Online (Sandbox Code Playgroud)
文档在这个主题上有点稀疏和混乱,特别是当涉及到本地多人游戏和互联网上的比赛之间的差异时.例如,在找到加入该匹配的玩家之前,似乎有必要对本地玩家进行身份验证并创建匹配(创建任何匹配以匹配请求开始).然而,这个小金块似乎暗示:
标准用户界面允许玩家发现附近的其他玩家,即使这两个玩家当前都没有直接连接到Game Center.
另外,在搜索附近玩家中描述的流程中,在通过传递给通知块的玩家找到玩家之后,直到步骤3才创建匹配请求 …
gamekit ×10
ios ×7
game-center ×4
iphone ×4
objective-c ×3
icloud ×2
ipad ×2
android ×1
flutter ×1
instruments ×1
ios9 ×1
sprite-kit ×1
swift ×1
xcode ×1