Отправить NSString через Game Center - PullRequest
0 голосов
/ 08 марта 2012

Я хочу отправить еще одну форму NSString на другой iPhone / iPad через Gamecenter, но она вылетает с EXC_BAD_ACCESS

здесь, в файле .h

typedef enum {
    kMessageTypeRandomNumber = 0,
    kMessageTypeGameBegin,
    kMessageTypeSubmit,
    kMessageTypeExchange,
    kMessageTypePickup,
    kMessageTypePass,
    kMessageTypeGameOver
} MessageType;

typedef struct {
    MessageType messageType;
} Message;

typedef struct {
Message message;
NSString *submitTile;
} MessageSubmit;

и здесь, в файле .m

- (void)sendData:(NSData *)data {
    NSError *error;
    BOOL success = [[GCHelper sharedInstance].match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];
    if (!success) {
        CCLOG(@"Error sending init packet");
        [self matchEnded];
    }
}
-(void)sendSubmit:(NSString *) submitTile {
    MessageSubmit message;
    message.message.messageType = kMessageTypeSubmit;
    message.submitTile = submitTile;
    NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageSubmit)];    
    [self sendData:data];
}

, и если я нажму на изображение CCMenu, он вызовет функцию onSubmit, а вот функция onSubmit

-(void)onSubmit
{
    NSString *submitStr = @"1-7-7 =-7-8 1-7-9";

    [self sendSubmit:submitStr];
}

, а последний - метод didReceiveData

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
    if (message->messageType == kMessageTypeSubmit) {
        MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];
        NSString *submitStr = messageSubmit->submitTile;

        NSLog(@"SubTile %@",submitStr);
    }
}

он имеет EXC_BAD_ACCESS в строке NSString *submitStr = messageSubmit->submitTile;.

Есть ли способ отправить сообщение NSString через iPhone / iPad?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

попробуйте это:

Для кодирования:

NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding];

, которые вы можете отправить с помощью Game Center

Для декодирования:

NSString *recievedString = [NSString stringWithUTF8String:[recievedData bytes]];

Редактировать: Теперь я думаю, что вы даже можете поместить эти данные в одну из структур вашего сообщения и сделать тот же трюк [NSData dataWithBytes:&message length:sizeof(MessageSubmit)] и отправить его.

1 голос
/ 08 марта 2012

Вы не можете сделать это:

NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageSubmit)];    

... или это:

MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];

Вообще говоря, вы не можете просто отправить представление объектов в памятивокруг как есть.Например, переменная экземпляра submitTile этого класса является указателем на объект NSString.Когда вы отправляете данные по сети, вы не отправляете саму строку, вы отправляете указатель, который является просто адресом памяти фрагмента памяти на отправляющем устройстве.Приемное устройство не будет хранить нигде одинаковую строку, и не будет иметь тот же адрес памяти, даже если бы он был.Таким образом, у вас есть бессмысленный указатель, указывающий на никуда, и вы ожидаете, что он укажет на строку, которая не существует.

Самый простой способ сделать то, что вы хотите сделать, это сделать ваш MessageSubmit класс NSCoding -совместимый.Сериализуйте его в NSData вместо того, чтобы просто сделать копию байтов.

...