0

これは私の最初の投稿であり、私が最初のiOSアプリを完成させるために働いたときに、過去数日間にどれだけ助けてくれたかわからない多くのスタックオーバーフローの貢献者に感謝することから始めたいと思いました。私は彼らと彼らに投稿する場所を与えてくれたこのサイトに感謝します。その借金の一部を「返済」するために、私が助けられたので、これが他の人を助けることを願っています...

そのため、私のアプリはGKPeerPickerControllerを使用して2番目のデバイスに接続します。接続されると、デバイスは相互にテキストメッセージを送信できます。受信側のピアでは、メッセージがUIAlertViewに表示されます。すべてが正常に機能していました。

次に、場所を試して、現在の場所を取得するためのコードを追加することにしました。私はそれを度、分、秒の緯度と経度に変換し、それらを1つのNSStringに入れます。ストーリーボードに「場所の送信」というボタンを追加しました。このボタンをタップすると、接続されているピアに場所が送信されます。これが私が問題に遭遇した場所です。

btnSendLocationは、NSStringを使用してsendPacketを呼び出します。sendPacketは文字列をNSDataに変換し、失敗していたsendDataToAllPeersを呼び出します。エラーをキャプチャする方法を学んだとき、それは「--sendDataToAllPeers:withDataMode:error:の無効なパラメータ」でした。エラーが発生するのはなぜですか?sendPacketを呼び出して正常に動作する他の2つのメソッドがあります。

    -(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...
    }
4

1 に答える 1

0

私はさらにいくつかのテストを行うことができ、答えを見つけました。問題はsendDataToAllPeersではなく、NSString(strToSend)からNSDataへの変換にありました。

packet = [strToSend dataUsingEncoding:NSASCIIStringEncoding];

具体的には、度記号文字(小さな円、ASCII 176)でした。NSASCIIStringEncodingには、127までのASCII文字のみが含まれます。これは、NSString.h(Foundation.framework)のコメントで確認されています。問題を見つけるためのより迅速な方法があったと確信していますが、Objective-CまたはXcodeのデバッグ機能についてはまだ十分に理解していません。

于 2012-04-08T20:32:00.307 に答える