GameKit蓝牙传输问题

Pri*_*yat 3 iphone cocoa bluetooth gamekit

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

有人遇到过这个问题吗?

Aya*_*yal 13

使用GameKit一段时间后我发现每个'发送'的限制大约为90k,所以如果你的文件大于90k你将不得不将其分解.以下是我建议你解决问题的方法:

1st - 发送文件名

NSData* fileNameData = [fileNameStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'fileNameData'
Run Code Online (Sandbox Code Playgroud)

第二 - 发送您要发送的块数

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'
Run Code Online (Sandbox Code Playgroud)

3rd - 分解并将你的NSData对象发送到一组每个小于50k的NSObjects(只是为了安全大小)

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'  
}
Run Code Online (Sandbox Code Playgroud)

在接收方,您需要执行以下操作:

1st - 接收文件名

// Receive data
NSString* fileNameStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]
Run Code Online (Sandbox Code Playgroud)

第二 - 接收您即将收到的块数

// Receive data
NSString* chunkCountStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]
NSUInteger chunkCount = [chunkCount intValue];
Run Code Online (Sandbox Code Playgroud)

3 - 接收数据块

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

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

希望这会有所帮助 - AYAL