GameCenter を使用して 2 つのデバイス間でマッチメイキングを行った後、情報を送受信する際に発生した Objective-C の問題を誰かが解決してくれることを期待していました。
Beginning iOS Game Center and Game Kit という教科書を参考にして、サンプルプログラムを進めているのですが、ゲームをプレイしている端末からデータを受け取りたい部分で行き詰っています。
2 つのデバイスと表示される適切なビューを正常に一致させることができます。私の GameCenterManager.m ファイルには、情報を送信するための 2 つの関数があります。1 つは次のとおりです。
- (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");
}
これも呼び出されません。おそらく、前の関数がそれを呼び出すことができないためです。
なぜこれがしばらくうまくいかないのかを調べてみましたが、役に立ちませんでした。誰かが私が間違っているところを指摘できますか? 関連するすべてのコードを入力したことを願っていますが、質問がある場合は質問してください。
よろしくお願いします。