2010-05-20 102 views
3

我想通过使用GameKit框架的蓝牙发送文件。我遇到的问题是,我一次只能发送一个NSData对象,但我需要将它保存在另一端。如果不知道文件名,这显然是不可能的,但我不知道如何传输。我试图将其转换为字符串NSData*data = [NSData dataWithContentsOfFile:urlAddress];,但我只能发送一个NSData对象,而不是两个。GameKit蓝牙传输问题

有没有人遇到过这个问题呢?

回答

13

使用GameKit一段时间我发现每发送一个约90k的限制,所以如果你的文件大于90k,你将不得不分解它。这里是我建议你打破上去:

月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对象到一组小于50k的NSObject中(只是要保证安全大小)

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]; 

3rd - 接收大块数据

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

如果一切正常, t现在您将拥有包含文件名的fileNameStr对象和包含文件内容的data对象。

希望这有助于 - AYAL

+0

感谢AYAL为您详细的答复,我会很快走出检查你的代码,让你知道如何去。 – Pripyat 2010-05-31 20:29:12

+0

很好的回应! :) 非常感谢。 – Nick 2010-10-14 13:38:17

+0

有没有人有这样做的项目,只是不知道文件名位。我想发送图片 – Burf2000 2011-07-10 18:34:30