你好 iOS 上的问题

Bonjour issues on iOS

我正在尝试在我的 iOS 应用程序中创建 Bonjour 服务,但无法发布它。仅 netServiceWillPublish 委托方法被调用,服务未使用 dns-sd 显示。

这是我的代码:

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) {
        [=11=].withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<sockaddr_in>.size) {
            return CFDataCreate(kCFAllocatorDefault, [=11=], MemoryLayout<sockaddr_in>.size)
        }
    }

    CFSocketSetAddress(ipv4Socket, sincfd)

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

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

我是 iOS 中这种类型的网络的新手,我在这里做错了什么?

使用 service?.publish(options: NetService.Options.listenForConnections) 而不是自己创建套接字解决了这个问题。

最终让以这种方式发布将自动为 NetService.

创建 IPv4 和 IPv6 的 TCP 侦听器

A​​pple 文档:

/* 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 }