簡體   English   中英

NSNetService 問題

[英]NSNetService Problems

我正在嘗試在 iOS 設備和 Mac 之間建立 Bonjour 連接。 發現彼此效果很好,但我遇到了setTXTRecordData:的問題。 它總是失敗(BOOL 返回 NO)...

_serviceInstances 創建:

-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
    [aNetService retain];

    [aNetService setDelegate:self];
    [aNetService startMonitoring];

    [aNetService performSelectorOnMainThread:@selector(resolve) withObject:nil waitUntilDone:YES];
[_serviceInstances addObject:aNetService];
}

發送嘗試:

NSNetService*service = [_serviceInstances objectAtIndex:[servicesTable selectedRow]];

[service setDelegate:self];

NSDictionary*txtRecordDataDictionary = [NSDictionary dictionaryWithObject:@"2" forKey:@"Version"];

if (service)
{
    BOOL success = [service setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:txtRecordDataDictionary]];   

    if (!success)
    {
        NSRunCriticalAlertPanel(@"Sync Error", @"Failed to contact Client. Please restart Carbon on your iPad and try again.", @"OK", nil, nil);
    }

    NSLog(@"Service: %@",service);
}

NSLog 消息輸出Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad是正確的。

iOS 代碼:

NSNetService*service = [[NSNetService alloc] initWithDomain:@"local." type:@"_test._tcp." name:[[UIDevice currentDevice] name] port:28];
[service setDelegate:self];
[service setTXTRecordData:nil];
[service publish];

[service startMonitoring];


- (void)netService:(NSNetService *)sender didUpdateTXTRecordData:(NSData *)data
{
    NSLog(@"Got Data! of %@",sender);

    NSPropertyListFormat format;
    NSDictionary*dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:&format errorDescription:nil];


    UIAlertView *myAlert = [[UIAlertView alloc]
                            initWithTitle:[sender name] message:[dict objectForKey:@"Version"]
                            delegate:self 
                            cancelButtonTitle:nil
                            otherButtonTitles:@"OK", nil];
    [myAlert show];  
    [myAlert release];
}

出於某種原因,當我啟動 iPad 應用程序(除標題之外的空白內容)但不響應來自我的 Mac 的任何信號時,會調用警報。

我確定我錯過了什么?

只有服務的發布者才能設置 TXT 記錄數據。 已發布服務的發現者可以讀取 TXT 記錄,但不能更改它。 TXT 記錄為服務的發布者提供了一種發布其他公開可讀數據的方法,這些數據可以從 DNS 條目中讀取,而無需直接聯系發布者。

ETA:至少, NSNetService的文檔看起來好像您不需要解析服務就可以獲取 TXT 記錄數據。 CFNetService文檔指出,您必須先解析服務,然后才能獲取 TXT 記錄數據。 CFNetServiceNSNetService似乎都只適用於可能的 DNS-SD 記錄的子集,這些記錄可以使用<dns_sd.h>中描述的 C API 創建和發現,它允許將多個 TXT 記錄附加到單個廣告服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM