Ios 在两台设备之间发送数据时,数据会被弄乱

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 {

我建立了一个多人游戏,它在我的iPhone 5s上完美地运行,并在模拟器上运行。但是,每当我试着从我的5s开始玩iphone5时,就会出现一些问题

游戏向另一个玩家发送两个值:分数和等级

如果iphone5s发送值:iphone5认为分数=0,级别=我们作为分数发送的值

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(……等到一个具有不同字节顺序的体系结构可能出现)。