2016-12-08 13 views
6

iOSアプリケーションでBonjourサービスを作成しようとしていますが、公開することができません。 netServiceWillPublishデリゲートメソッドだけが呼び出され、サービスはdns-sdを使用して表示されません。ここでBonjourのiOSに関する問題

は私のコードです:

var service: NetService? = nil 

func start() { 
    createSockets() 

    service = NetService(domain: "test", type: "_test._tcp.", name: "Test", port: Int32(port)) 
    service?.delegate = self 
    service?.startMonitoring() 
    service?.publish() 
    service?.setTXTRecord(NetService.data(fromTXTRecord: [ 
     "model": "AppleTV3,2,1".data(using: .utf8)!, 
     "srcvers": "160.10".data(using: .utf8)!, 
     "features": "0x100009FF".data(using: .utf8)!, 
     "deviceId": "b8:53:ac:43:f3:15".data(using: .utf8)!, 
     "pw": "0".data(using: .utf8)!, 
     "rmodel": "MacBookPro10,2".data(using: .utf8)! 
     ])) 

} 

private func createSockets() { 
    ipv4Socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAutomaticallyReenableAcceptCallBack, socketCallback, nil) 

    var sin = sockaddr_in() 

    memset(&sin, 0, MemoryLayout<sockaddr_in>.size) 
    sin.sin_len = __uint8_t(MemoryLayout<sockaddr_in>.size) 
    sin.sin_family = sa_family_t(AF_INET); /* Address family */ 
    sin.sin_port = in_port_t(port) /* Or a specific port */ 
    sin.sin_addr.s_addr = INADDR_ANY 

    let sincfd = withUnsafePointer(to: &sin) { 
     $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<sockaddr_in>.size) { 
      return CFDataCreate(kCFAllocatorDefault, $0, MemoryLayout<sockaddr_in>.size) 
     } 
    } 

    CFSocketSetAddress(ipv4Socket, sincfd) 

    let socketsource = CFSocketCreateRunLoopSource(
     kCFAllocatorDefault, 
     ipv4Socket, 
     0); 

    CFRunLoopAddSource(
     CFRunLoopGetCurrent(), 
     socketsource, 
     CFRunLoopMode.defaultMode); 
} 

私はiOSの中でこの種類のネットワークに新たなんだ、私はここで間違って何をやっていますか?

+2

たぶん、あなたはあなたのNetServiceの参照を維持しようとすることができますか?多分それは割り当てが解除されたでしょう。 – koropok

+1

NetServiceには、動作していないコードのクラスレベルの参照があります。私はポストでこれを変更して、私たちが独自に行っていることを明らかにしました。コードスニペットを更新して反映させていきます。ありがとう。 – Jake

+0

私はbonjour接続のためにobj-cサードパーティを使用していますが、正常に動作しています。それが助けになるかどうか分からない。 https://github.com/jdiehl/async-network – koropok

答えて

5

service?.publish(options: NetService.Options.listenForConnections)を使用してソケットを作成していないので、問題が修正されました。

このように公開すると、自動的にNetServiceのIPv4とIPv6の両方のTCPリスナーが作成されます。

アップルのドキュメント:

/* When passed to -publishWithOptions:, in addition to publishing the service, a 
* TCP listener is started for both IPv4 and IPv6 on the port specified by the 
* NSNetService. If the listening port can't be opened, an error is reported using 
* -netService:didNotPublish:. Specify a port number of zero to use a random port. 
* When -netServiceDidPublish: is called, -port will return the actual listening 
* port number. Since the listener only supports TCP, the publish will fail with 
* NSNetServicesBadArgumentError if the NSNetService type does not end with "_tcp". 
* New incoming connections will be delivered in the form of NSStreams via the 
* -netService:didAcceptConnectionWithInputStream:outputStream: delegate method. 
*/ 
@available(iOS 7.0, *) 
public static var listenForConnections: NetService.Options { get } 
関連する問題