0

我希望有人能够帮助解决我遇到的与使用 GameCenter 在两台设备之间发送和接收信息有关的 Objective-C 问题,一旦他们完成了配对。

我正在使用一本名为“Beginning iOS Game Center and Game Kit”的教科书作为我的指南,它正在通过一个示例程序,但我被困在我想从玩游戏的设备接收数据的部分。

我可以成功匹配两个设备并显示相应的视图。我的 GameCenterManager.m 文件中有两个函数用于发送信息 - 一个如下:

- (void)sendStringToAllPeers:(NSString *)dataString reliable:(BOOL)reliable
{
NSLog(@"Send String To All Peers");
NSLog(@"Data String: %@", dataString);
NSLog(@"match or session %@", self.matchOrSession);

if (self.matchOrSession == nil)
{
    NSLog(@"GC Manager matchorsession ivar was not set - this needs to be set with the GKMatch or GKSession before sending or receiving data");
    return;
}
NSData *dataToSend = [dataString dataUsingEncoding:NSUTF8StringEncoding];
GKSendDataMode mode;
if (reliable)
{
    mode = GKSendDataReliable;
}
else{
    mode = GKSendDataUnreliable;
}

NSError *error = nil;
if ([self.matchOrSession isKindOfClass:[GKSession class]])
{
    NSLog(@"Match or session 1");
    NSLog(@"Data to send: %@", dataToSend);
    [self.matchOrSession sendDataToAllPeers:dataToSend withDataMode:mode error:&error];

}

else if ([self.matchOrSession isKindOfClass:[GKMatch class]])
{
    NSLog(@"Match or session 2");
    NSLog(@"Data to send: %@", dataToSend);
    [self.matchOrSession sendDataToAllPlayers:dataToSend withDataMode:mode error:&error];
}

else
{   
    NSLog(@"GC Manager matchOrSession was not a GKMatch or a GK Session, we are unable to send data");
}

if (error != nil)
{
NSLog(@"An error occurred while sending data %@", [error localizedDescription]);

}
}

我从我的 racetohundredViewController.m 文件中的一个函数调用这个函数:

- (void)generateAndSendHostNumber;
{
NSLog(@"Generate and send host number");
randomHostNumber = arc4random();
NSString *randomNumberString = [NSString stringWithFormat: @"$Host:%f", randomHostNumber];
NSLog(@"the random number string is: %@", randomNumberString);
[self.gcManager sendStringToAllPeers:randomNumberString reliable: YES];
}

我成功地得到了以下 NSLog 输出:

2013-01-02 22:27:43.519 First to 50[1376:907] Send String To All Peers
2013-01-02 22:27:43.520 First to 50[1376:907] Data String: $Host:2087825492.000000
2013-01-02 22:27:43.521 First to 50[1376:907] match or session <GKMatch 0x200853d0 expected count: 0 seqnum: 2
G:1656671636:connected
reinvitedPlayers:(
)>
2013-01-02 22:27:43.522 First to 50[1376:907] Match or session 2
2013-01-02 22:27:43.523 First to 50[1376:907] Data to send: <24486f73 743a3230 38373832 35343932 2e303030 303030>

所以我可以看到“要发送的数据”输出,这很棒。

但是我现在有了命令

[self.matchOrSession sendDataToAllPeers:dataToSend withDataMode:mode error:&error];

这似乎根本没有带我去任何地方。我在 GameCenterManager.m 中有以下功能:

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
{
NSLog(@"*****Receive Data In Session");
NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSDictionary *dataDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:dataString, peer, session,  nil] forKeys:[NSArray arrayWithObjects: @"data", @"peer", @"session", nil]];

[self callDelegateOnMainThread: @selector(receivedData:) withArg: dataDictionary error: nil];
}

但我没有看到这个的 NSLog 输出。同样,我的racetohundredViewController.m 文件中有一个函数

- (void)receivedData:(NSDictionary *)dataDictionary
{
    NSLog(@"------Received Data");
}

也不会被调用;大概是因为以前的函数无法调用它。

我一直在试图弄清楚为什么这在一段时间内不起作用,但没有任何用处。谁能指出我哪里出错了?我希望我已经输入了所有相关代码,但如果您有任何问题,请提出。

谢谢大家,提前。

4

1 回答 1

0

在网上查看其他人对同一件事的问题后,我意识到自己做了什么。我找到匹配后没有设置我的代表,一个非常菜鸟的错误!

于 2013-01-02T23:57:33.603 回答