4

NSNetService を使用して、iPhone アプリと Mac アプリの間の通信をセットアップしようとしています。

iPhoneアプリが検出できるNSNetServiceを公開するようにMacアプリをセットアップするところまで来ましたが、それらの間でデータを送信する方法がわかりません。

私の Mac アプリでは、次のように NSNetService を公開しています。

self.netService = [[NSNetService alloc] initWithDomain:@"" type:@"_sputnik._tcp" name:@"" port:port];
if (self.netService) {
    [self.netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:@"PrivateMyMacServiceMode"];

    [self.netService setDelegate:self];
    [self.netService publish];
    [self.netService startMonitoring];
    NSLog(@"SUCCESS!");
} else {
    NSLog(@"FAIL!");
}

すべてが正常に見え、delegate メソッド- (void)netServiceDidPublish:(NSNetService *)sender(Mac アプリ内) がトリガーされます。

iPhone アプリで のインスタンスを作成するNSNetServiceBrowserと、1 ~ 2 秒後にdidFindServiceデリゲート メソッドがトリガーされます。

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    TRACE;
    NSLog(@"moreComing: %d", moreComing);
    self.connectedService = aNetService;
    if (!moreComing) {
        self.connectedService.delegate = self;
        [self.connectedService resolveWithTimeout:30];
    }
}

この直後に、次のデリゲート メソッドがトリガーされます- (void)netServiceDidResolveAddress:(NSNetService *)sender

ここでは、接続されているかどうかわかりません。接続方法や接続状態が見つかりませんsender

だから私は出力ストリームに書き込もうとしました:

[self.connectedService getInputStream:&istream outputStream:&ostream];
NSString *test = @"test";
NSData *data = [test dataUsingEncoding:NSUTF8StringEncoding];
[ostream write:[data bytes] maxLength:[data length]];

また、TXTRecordData を で更新し[sender setTXTRecordData:data];ます。エラーは発生せず、Mac アプリでは何も起こりません。Mac アプリにはデリゲート メソッドがあり- (void)netService:(NSNetService *)sender didUpdateTXTRecordData:(NSData *)dataます。

進め方がわかりません。何かが足りないと思いますが、それが Mac アプリにあるのか iPhone アプリにあるのかわかりません。まず、iPhone アプリから Mac アプリに何らかの方法で接続する必要があると思います。Mac アプリでは、接続をリッスンするものを追加します。

4

2 に答える 2

4

アップルが主張するすべてを信じないでください。

でストリームを設定するには、多くの問題がありますNSNetworkService

次のようにするとうまくいきます。

まず、ネットワークを公開するポートを取得します。自分でポートを選択しないでください。

その後、そのポートを使用してネットワークを公開できます。

次を使用してクライアント ストリームを取得します。

[nService qNetworkAdditions_getInputStream:&istream outputStream:&ostream];

多くのプログラマーが犯す間違いは、自分でポートを選択してからストリームを開くことによってネットワークを公開することです

[nService qNetworkAdditions_getInputStream:&istream outputStream:&ostream];

ストリームが開かない....

結論:最初にポートを取得して公開し、次に次のようなものを使用します:

self.netService = [[NSNetService alloc] initWithDomain:@"local" type:@"_xxx._tcp." name:serviceName port:(int) self.port];
open streams with
CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, &readStream, &writeStream);
open streams with (you open a connection here)
EchoConnection * connection = [[EchoConnection alloc] initWithInputStream:( NSInputStream *)readStream outputStream:( NSOutputStream *)writeStream];
        [self.connections addObject:connection];

次に、サービスを参照して追加します

次に、閲覧したサービスから目的のサービスでストリームを開きます

[nService qNetworkAdditions_getInputStream:&istream outputStream:&ostream];
(and open them with [istream open] and [ostream open])
于 2013-01-27T14:15:44.890 に答える
2

おそらく、最初に出力ストリームを開く必要がありますか?

[ostream open];
于 2012-08-24T09:34:34.100 に答える