iPhone SDK: GameKit и большие файлы + потеря соединения - PullRequest
2 голосов
/ 31 августа 2009

Некоторое время я играл с GameKit, но теперь я сталкиваюсь с очень тяжелыми трудностями.

Я собираюсь отправить через Bluetooth файлы большего размера - 1-2 МБ. Я уже подготовил пакеты (около 8 КБ каждый).

Мое приложение работает, как описано на следующей схеме:

iPhone - sending header: file divided into 25 parts
iPod - received header: OK I got it waiting for 25 parts
iPhone - sending part #1
iPod - received part #1 send next
iPhone - sending part #2
iPod - received part #2 send next
...
iPhone - sending part #24
iPod - received part #24 send next
iPhone - sending part #25
iPod receiving part #25 processing file

Я отправляю как части файла, так и сообщения (подтверждение доставки), используя:

[mSession sendData:data toPeers:mPeers withDataMode:GKSendDataReliable error:nil];

и получение данных:

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context

Я хотел бы знать, как вы справляетесь с некоторыми проблемами, которые могут возникнуть во время передачи по Bluetooth. Просмотр документации GKSessionDelegate не дает мне никакой информации, если данные были доставлены или нет.

В 90% случаев передача работает нормально, но иногда она внезапно останавливается и не продолжается без переподключения / перезапуска приложения.

Я попытался изобрести простое решение для повторной установки данных, если я не получу ответ в течение 1 секунды:

-(void)sendAgain {
    [self sendData:bufor];
}
-(void)sendData:(NSData *)data {
    bufor = [data retain];

    timeoutTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(sendAgain) userInfo:nil repeats:NO];

    [mSession sendData:data toPeers:mPeers withDataMode:GKSendDataReliable error:nil];
}

timeOutTimer становится недействительным, если отправитель получил подтверждение успешной доставки файловой части. Но на самом деле, когда я внедряю это решение, с этим возникает еще больше проблем.

Устройства находятся рядом друг с другом на столе.

Как вы справляетесь с проблемами «недоставленных» данных между устройствами? Это всего лишь инструмент, но как это может раздражать при разработке игр?

Кстати, отправка коротких чатов никогда не вызывала проблем, и я использую те же методы.

На самом деле соединение теряется очень редко, просто данные любят теряться в эфире. Я уже делю части, поэтому размер данных составляет около 8 КБ, что действительно делает передачу изображений очень медленной.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Каркас GameKit на данный момент не очень надежен, даже для простого обмена данными для игр, над которыми я работаю. Я бы не использовал его для передачи больших данных, вы просто просите головной боли.

1 голос
/ 22 сентября 2010

Я согласен как с "it", так и с "refulgentis". Делать это через GK требует ненадежного исполнения. Вам лучше настроить это через Bonjour и Wi-Fi, или чтобы каждый пользователь загружал контент из какого-то центрального автономного источника. Если ваш дизайн требует, чтобы большие файлы перемещались с одного устройства на другое, вы можете загрузить их с одной стороны и загрузить с другой, а не пытаться передавать файлы с одного устройства на другое.

...