Ios 在两台设备之间发送数据时,数据会被弄乱
我建立了一个多人游戏,它在我的iPhone 5s上完美地运行,并在模拟器上运行。但是,每当我试着从我的5s开始玩iphone5时,就会出现一些问题 游戏向另一个玩家发送两个值:分数和等级 如果iphone5s发送值:iphone5认为分数=0,级别=我们作为分数发送的值Ios 在两台设备之间发送数据时,数据会被弄乱,ios,objective-c,game-center,gamekit,Ios,Objective C,Game Center,Gamekit,我建立了一个多人游戏,它在我的iPhone 5s上完美地运行,并在模拟器上运行。但是,每当我试着从我的5s开始玩iphone5时,就会出现一些问题 游戏向另一个玩家发送两个值:分数和等级 如果iphone5s发送值:iphone5认为分数=0,级别=我们作为分数发送的值 typedef struct { NSUInteger score; NSUInteger level; } MessageNewScore; - (void)sendData:(NSData *)data {
typedef struct {
NSUInteger score;
NSUInteger level;
} MessageNewScore;
- (void)sendData:(NSData *)data {
NSError *error;
GameKitHelper *gameKitHelper = [GameKitHelper sharedGameKitHelper];
BOOL success = [gameKitHelper.match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];
if (!success) {
NSLog(@"Error sending data:%@", error.localizedDescription);
}
}
// Run on iPhone 5s
- (void)sendNewScore:(NSUInteger)score level:(NSUInteger)level{
NSLog(@"score: %lu", (unsigned long)score); // E.g. 1930
NSLog(@"level: %lu", (unsigned long)level); // E.g. 7
MessageNewScore messageNewScore;
messageNewScore.message.messageType = kMessageTypeNewScore;
messageNewScore.score = score;
messageNewScore.level = level;
NSData *data = [NSData dataWithBytes:&messageNewScore
length:sizeof(MessageNewScore)];
[self sendData:data];
NSLog(@"score: %lu", (unsigned long)messageNewScore.score); // 1930
NSLog(@"level: %lu", (unsigned long)messageNewScore.level); // 7
}
// Run on iPhone 5
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
MessageNewScore *messageNewScore = (MessageNewScore*)[data bytes];
NSLog(@"score: %lu", (unsigned long)messageNewScore->score); // According to iPhone 5 this is 0
NSLog(@"level: %lu", (unsigned long)messageNewScore->level); // According to iPhone 5 this is 1930
[_delegate enemysScoreReceived:messageNewScore->score level:messageNewScore->level];
}
在最后一种情况下,来自登录sendNewScore::
的值是正确的,而来自didReceiveData::
的值是错误的。
我认为这可能与5s中的64位处理器有关,但不确定如何解决这个问题。iPhone 5使用苹果A6(32位),iPhone 5s使用苹果A7(64位)处理器
您需要对播放器之间以便携式表示形式发送的
NSData
进行编码/解码,例如可以使用NSKeyedArchiver
/NSKeyedUnarchiver
进行编码/解码NSInteger
s,等等。您当前正在发送表示特定于处理器的struct
s。iPhone 5使用Apple A6(32位)处理器,iPhone 5S使用Apple A7(64位)处理器
您需要对播放器之间以便携式表示形式发送的
NSData
进行编码/解码,例如可以使用NSKeyedArchiver
/NSKeyedUnarchiver
进行编码/解码NSInteger
s,等等。您当前正在发送表示特定于处理器的struct
s。iPhone 5使用Apple A6(32位)处理器,iPhone 5S使用Apple A7(64位)处理器
您需要对播放器之间以便携式表示形式发送的
NSData
进行编码/解码,例如可以使用NSKeyedArchiver
/NSKeyedUnarchiver
进行编码/解码NSInteger
s,等等。您当前正在发送表示特定于处理器的struct
s。iPhone 5使用Apple A6(32位)处理器,iPhone 5S使用Apple A7(64位)处理器
您需要对播放器之间以便携式表示形式发送的
NSData
进行编码/解码,例如可以使用NSKeyedArchiver
/NSKeyedUnarchiver
进行编码/解码NSInteger
s,等等。您当前正在发送表示特定于处理器的struct
s。为什么不使用NSDictionary
将数据作为键/值对而不是struct发送?嗯,我从来没有想过。在我使用的教程中是这样做的。@yoeriboven教程可能比iphone5s(64位)旧。是的,它是。由于有几次不推荐的方法,你不得不寻找其他方法来做某事。你为什么会被否决?我有一个确切的问题,谢谢你的提问。为什么不使用NSDictionary
将数据作为键/值对而不是结构发送?嗯,从来没有想过。在我使用的教程中是这样做的。@yoeriboven教程可能比iphone5s(64位)旧。是的,它是。由于有几次不推荐的方法,你不得不寻找其他方法来做某事。你为什么会被否决?我有一个确切的问题,谢谢你的提问。为什么不使用NSDictionary
将数据作为键/值对而不是结构发送?嗯,从来没有想过。在我使用的教程中是这样做的。@yoeriboven教程可能比iphone5s(64位)旧。是的,它是。由于有几次不推荐的方法,你不得不寻找其他方法来做某事。你为什么会被否决?我有一个确切的问题,谢谢你的提问。为什么不使用NSDictionary
将数据作为键/值对而不是结构发送?嗯,从来没有想过。在我使用的教程中是这样做的。@yoeriboven教程可能比iphone5s(64位)旧。是的,它是。由于有几次不推荐的方法,你不得不寻找其他方法来做某事。你为什么会被否决?我有一个确切的问题,谢谢你的提问。以前从未使用过NSKeyedArchiver
。您可以显示一些示例代码吗?@yoerib甚至可以使用initForWritingWithMutableData:
初始化一个实例,然后根据需要调用encodeInt:withKey:
,等等。或者只需将struct
类型从NSUInteger
更改为固定大小的类型,例如uint32\t
@rmaddy(…并等待具有不同字节顺序的体系结构出现)“UnHiLigg会考虑。以前从未使用过<代码> NKEKEDIGORVER 。你可以用一个实例来初始化一个实例吗?用<代码> .InFrutsWrutoWrutabelDATA:<代码>,然后按需要调用<代码> EnCODIET::按KEY:<代码> >,或者简单地将<代码>结构> <代码>类型从<代码> NSUInteger <代码>到一个固定大小的SUC。h作为uint32\u t
@rmaddy(…并等待具有不同字节顺序的体系结构出现)“UnHiLigg会考虑。以前从未使用过<代码> NKEKEDIGORVER 。你可以用一个实例来初始化一个实例吗?用<代码> .InFrutsWrutoWrutabelDATA:<代码>,然后按需要调用<代码> EnCODIET::按KEY:<代码> >,或者简单地将<代码>结构> <代码>类型从<代码> NSUInteger <代码>到一个固定大小的SUC。h作为uint32\u t
@rmaddy(…并等待具有不同字节顺序的体系结构出现)“UnHiLigg会考虑。以前从未使用过<代码> NKEKEDIGORVER 。你可以用一个实例来初始化一个实例吗?用<代码> .InFrutsWrutoWrutabelDATA:<代码>,然后按需要调用<代码> EnCODIET::按KEY:<代码> >,或者简单地将<代码>结构> <代码>类型从<代码> NSUInteger <代码>到一个固定大小的SUC。h作为代码> UTI32 32 t < /COD> .@ RMIDATE(……等到一个具有不同字节顺序的体系结构可能出现)。