Проблема с передачей GameKit по Bluetooth

Я пытаюсь отправить файл через Bluetooth, используя платформу GameKit. Проблема, с которой я столкнулся, заключается в том, что я могу отправлять только один объект NSData за раз, но мне нужно сохранить его на другом конце. это, очевидно, невозможно без знания имени файла, но я не знаю, как это передать. Я пытался преобразовать его в строку NSData*data = [NSData dataWithContentsOfFile:urlAddress];, но я могу отправить только один объект NSData, а не два.

Кто нибудь сталкивался с этой проблемой?


person Pripyat    schedule 20.05.2010    source источник


Ответы (1)


Некоторое время работая с GameKit, я обнаружил, что существует ограничение около 90 КБ на «отправку», поэтому, если ваш файл больше 90 КБ, вам придется его разбить. Вот как я бы посоветовал вам расстаться:

1-й - Отправьте имя вашего файла

NSData* fileNameData = [fileNameStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'fileNameData'

2-й - Отправьте количество блоков, которые вы собираетесь отправить

NSUInteger fiftyK = 51200;
NSUInteger chunkCount = (((NSUInteger)(srcData.length / fiftyK)) + ((srcData.length % fiftyK) == 0 ) ? 0 : 1))
NSString chunkCountStr = [NSString stringWithFormat:@"%d",chunkCount];
NSData* chunkCountData = [chunkCountStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'chunkCountData'

3-й - Разбейте и отправьте свой объект NSData в набор NSObjects размером менее 50 КБ каждый (просто для безопасного размера)

NSData *dataToSend;
NSRange range = {0, 0};
for(NSUInteger i=0;i<srcData.length;i+=fiftyK){
  range = {i,fiftyK};
  dataToSend = [srcData subdataWithRange:range];
  //send 'dataToSend'  
}
NSUInteger remainder = (srcData.length % fiftyK);
if (remainder != 0){
  range = {srcData.length - remainder,remainder};
  dataToSend = [srcData subdataWithRange:range];
  //send 'dataToSend'  
}

На принимающей стороне вам нужно сделать следующее:

1-й - получить имя файла

// Receive data
NSString* fileNameStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]

2-й - Получите количество блоков, которые вы собираетесь получить

// Receive data
NSString* chunkCountStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]
NSUInteger chunkCount = [chunkCount intValue];

3-й - получение фрагментов данных

NSMutableData data = [[NSMutableData alloc]init];
for (NSUInteger i=0; i<chunkCount;i++){
  // Receive data
  [data appendData:receivedData];
}

Если все работает правильно, теперь у вас будет объект fileNameStr, содержащий имя вашего файла, и объект data, содержащий содержимое вашего файла.

Надеюсь, это поможет - АЯЛ

person Ayal    schedule 31.05.2010
comment
Спасибо AYAL за подробный ответ, я скоро проверю ваш код и расскажу, как все прошло. - person Pripyat; 01.06.2010
comment
Отличный ответ! :) Большое спасибо. - person Nick; 14.10.2010
comment
Есть ли у кого-нибудь проект, который делает это, просто не уверен в бите имени файла. Я хочу отправить картинку - person Burf2000; 10.07.2011
comment
Отличный подробный ответ. На практике, сколько времени занимает отправка, скажем, файла размером 5 МБ? Я хочу отправлять PDF-файлы между устройствами. - person bencallis; 03.10.2012