GameKit蓝牙传输问题
Posted
技术标签:
【中文标题】GameKit蓝牙传输问题【英文标题】:GameKit Bluetooth Transfer Problem 【发布时间】:2010-05-20 20:25:20 【问题描述】:我正在尝试使用 GameKit 框架通过蓝牙发送文件。我遇到的问题是我一次只能发送一个 NSData 对象,但我需要将它保存在另一端。如果不知道文件名,这显然是不可能的,但我不知道如何传输它。我尝试将其转换为字符串NSData*data = [NSData dataWithContentsOfFile:urlAddress];
,但我只能发送一个 NSData 对象,而不是两个。
有人遇到过这个问题吗?
【问题讨论】:
【参考方案1】:使用 GameKit 一段时间后,我发现每次“发送”的限制约为 90k,因此如果文件大于 90k,则必须将其拆分。以下是我建议您拆分的方法:
1st - 发送文件名
NSData* fileNameData = [fileNameStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'fileNameData'
2nd - 发送你要发送的块数
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'
3rd - 将您的 NSData 对象拆分并发送到一组 NSObjects 中,每个 NSObjects 少于 50k(只是为了安全大小)
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'
在接收方,您需要执行以下操作:
1st - 接收文件名
// Receive data
NSString* fileNameStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]
2nd - 接收你将要接收的区块数
// 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];
如果一切正常,您现在将拥有一个包含文件名的 fileNameStr
对象和一个包含文件内容的 data
对象。
希望这会有所帮助 - 阿亚尔
【讨论】:
感谢 AYAL 的详细回复,我会尽快检查您的代码并告诉您进展如何。 很好的回应! :) 非常感谢。 有没有人有这样的项目,只是不确定文件名位。我要发图片 非常详细的答案。在实践中,发送一个 5mb 的文件需要多长时间?我希望在设备之间发送 PDF。以上是关于GameKit蓝牙传输问题的主要内容,如果未能解决你的问题,请参考以下文章
iPhone 到 iPhone 传输的 GameKIt 的替代品
原则上,Android 设备是不是可以通过蓝牙/GameKit 与 iPhone 交互?
GameKit (GKSession) : GKSession 决定使用 Wifi 或蓝牙时是不是有优先顺序(如果两者都可用)