GKSession sendDataToAllPeers获取无效参数

时间:2012-04-08 05:22:00

标签: iphone objective-c ios bluetooth gamekit

这是我的第一篇文章,我想通过感谢许多stackoverflow贡献者来启动它,他们在我工作完成我的第一个iOS应用程序时,永远不会知道他们过去几天帮助了我多少。我感谢他们和这个网站给他们一个发布的地方。为了“还清”部分债务,我希望这会帮助别人,因为我得到了帮助......

因此,我的应用程序使用GKPeerPickerController建立与第二个设备的连接。连接后,设备可以相互发送文本消息。接收对等体在UIAlertView中显示消息。一切都很好。

然后我决定尝试使用位置并添加代码来获取当前位置。我把它转换成纬度和经度以度,分和秒为单位的经度,并将它们放入一个NSString中。我在我的故事板上添加了一个名为“发送位置”的按钮,当点击该按钮时,将该位置发送给连接的对等点。这是我遇到问题的地方。

btnSendLocation使用NSString调用sendPacket。 sendPacket将字符串转换为NSData并调用失败的sendDataToAllPeers。当我学会如何捕获错误时,它是“无效的参数 - sendDataToAllPeers:withDataMode:error:”。为什么会发生错误?我有两个其他方法也调用sendPacket并正常工作。

    -(IBAction)btnSendLocation: (id)sender
    {
// Put latitude, longitude into string, then convert to NSData for sending
NSMutableString *tmp = [[NSMutableString alloc] initWithString:@"Latitude: "];
// Build the location string to send
[tmp appendString:slatitude];
    // …code for longitude
strToSend = [tmp copy];
bool sentPkt = false;
sentPkt = [self sendPacket:strToSend  failedWithError:nil];
}

    - (bool)sendPacket: (NSString *)strToSend failedWithError: (NSError *)error
{
bool sendPktOK = false;
packet = [strToSend dataUsingEncoding:NSASCIIStringEncoding];
// Send the packet.
sendPktOK = [self.currentSession sendDataToAllPeers:packet 
                       withDataMode:GKSendDataReliable error:&error];
// If there was an error, log it.
if (!sendPktOK) {
    NSLog(@"Error Domain: %@", [error domain]);
    NSLog(@"Error Descr: %@", [error localizedDescription]);
    NSLog(@"Error Code: %@", [error code]);
    return NO;
}    
return YES;
}

    - (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation
    {
//  Location default is decimal degrees notation; convert to deg-min-secs
    int degrees = newLocation.coordinate.latitude;
    double decimalPart = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimalPart * 60;
    double seconds = decimalPart * 3600 - minutes * 60;
    NSString slatitude = [NSString stringWithFormat:@"%d° %d' %1.1f\"",
                  degrees, minutes, seconds];
 // rest of code...
    }

1 个答案:

答案 0 :(得分:0)

我能够做更多测试并找到答案。问题不在sendDataToAllPeers中,而是在NSString(strToSend)到NSData的转换中:

packet = [strToSend dataUsingEncoding:NSASCIIStringEncoding];

具体来说,它是度数符号字符(小圆圈,ASCII 176)。 NSASCIIStringEncoding仅包含最多127个ASCII字符,这在NSString.h(Foundation.framework)的注释中得到确认。我确信有更快的方法可以找到问题,但我还不了解Objective-C或Xcode的调试工具。