2014-07-07 13 views
2

로컬 네트워크에서 피어를 검색하고 연결할 수있는 응용 프로그램을 만들고 싶습니다. 따라서 bonjour 프레임 워크를 사용하여 신속하게 구현하기로했습니다.Swift 응용 프로그램에서 NSNetService 및 NSNetServiceBrowser 사용

그러나 Bonjour는 Swift를 사용하여 작업 할 수 없으며 그 이유를 알 수 없습니다. 다음은이 서비스를 테스트하는 데 사용하는 코드입니다.

import Foundation 

let BM_DOMAIN = "local" 
let BM_TYPE = "_helloworld._tcp." 
let BM_NAME = "hello" 
let BM_PORT : CInt = 6543 

/// Netservice 
let nsns = NSNetService(domain: BM_DOMAIN, 
     type: BM_TYPE, name: BM_NAME, port: BM_PORT) 
let nsnsdel = BMNSDelegate() //see bellow 
nsns.delegate = nsnsdel 
nsns.publish() 

/// Net service browser. 
let nsb = NSNetServiceBrowser() 
let nsbdel = BMBrowserDelegate() //see bellow 
nsb.delegate = nsbdel 
nsb.searchForServicesOfType(BM_TYPE, inDomain: BM_DOMAIN) 

println("press enter") 
// this prevents the app from quitting instantly. 
NSFileHandle.fileHandleWithStandardInput().availableData 

위임자는 콘솔에 대한 모든 호출을 단순히 인쇄하는 코드입니다. 내가 Bonjour browser를 사용하는 경우

netServiceWillPublish:sender 
netServiceBrowserWillSearch 
press enter 

, 나는 서비스가 올바르게 게시 된 것을 볼 수 있습니다 여기에

class BMNSDelegate : NSObject, NSNetServiceDelegate { 
    func netServiceWillPublish(sender: NSNetService!) { 
     println("netServiceWillPublish:sender"); 
    } 
    // .....and so on for the 8 other methods..... 
} 

class BMBrowserDelegate : NSObject, NSNetServiceBrowserDelegate { 
    func netServiceBrowserWillSearch(aNetServiceBrowser: NSNetServiceBrowser!){ 
     println("netServiceBrowserWillSearch") 
    } 
    // .....and so on for the 6 other methods..... 
} 

이 샘플 코드의 출력됩니다. 그러나 두 대표의 콜백이 강렬한 디버깅 (와 유래에 읽기) 후

:-(**WillPublish 사람 옆에 호출되지 않습니다, 나는 그것이 작동하지 않는 이유를 알아낼 수 없습니다. 어떤 아이디어?

을 (나는 맥 OS X 10.9.3를 사용하고, 그리고 엑스 코드 6.0 베타

답변

2

NSNetServiceBrowser 실행하는 runloop 필요) 6A215l을 구축 할 수 있습니다. 대신에 표준 입력에서 읽는, NSRunLoop.currentRunLoop().run()를 호출합니다.

+0

에서 좋아 난 그냥이 테스트 한 당신은 맞다. – jib

+0

runloop을 실행하는 더 좋은 방법이 있습니까? 이 구현은 publish()를 수행하는 동안 다른 모든 것을 차단하는 것처럼 보입니다. – Dan

+0

예. Swift가 1.0으로 등장한 이후로이 모습을보고 싶습니다. –

1

을 전체 코드 없이는있을 수 있습니다 당신의 변수/상수를 선언했는지 의심 스럽네요. 함수에 로컬. 그들이 범위를 벗어나면 서비스에 대한 참조가 범위를 벗어났습니다. 그래서 STDIN으로부터 입력을 요청하는 블로킹 콜을 시도했다. 애플의 문서에 따르면, netService와 netServiceBrowser는 모두 암시 적으로 기본 실행 루프와 연관되어 있으므로 명시 적으로 수행 할 필요가 없습니다. 명시 적으로 실행 루프와 연관 시키면 프로그램이 멈추는 원인이됩니다. 이 코드는 다음과 같은 결과를 생성합니다.

netServiceWillPublish:<NSNetService 0x14522e00> local _helloworld._tcp. hello 
netServiceBrowserWillSearch 
netServiceDidPublish:<NSNetService 0x14522e00> local. _helloworld._tcp. hello 
netServiceDidFindService 

차단되지 않고 프로그램이 정상적으로 진행하지 못하게하는 실행 루프가 생성되지 않습니다. AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

var nsns:NSNetService? 
var nsnsdel:BMNSDelegate? 
var nsb:NSNetServiceBrowser? 
var nsbdel:BMBrowserDelegate? 


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 


    let BM_DOMAIN = "local" 
    let BM_TYPE = "_helloworld._tcp." 
    let BM_NAME = "hello" 
    let BM_PORT : CInt = 6543 

    /// Netservice 
    nsns = NSNetService(domain: BM_DOMAIN, 
     type: BM_TYPE, name: BM_NAME, port: BM_PORT) 
    nsnsdel = BMNSDelegate() //see bellow 
    nsns?.delegate = nsnsdel 
    nsns?.publish() 

    /// Net service browser. 
    nsb = NSNetServiceBrowser() 
    nsbdel = BMBrowserDelegate() //see bellow 
    nsb?.delegate = nsbdel 
    nsb?.searchForServicesOfType(BM_TYPE, inDomain: BM_DOMAIN) 

    //println("press enter") 
    // this prevents the app from quitting instantly. 
    // NSRunLoop.currentRunLoop().run() 
    // NSFileHandle.fileHandleWithStandardInput().availableData 

    return true 
} 

및 대리자가 다른 콜백 ...

class BMNSDelegate : NSObject, NSNetServiceDelegate { 
func netServiceWillPublish(sender: NSNetService!) { 
    println("netServiceWillPublish:\(sender)"); 
} 

func netService(sender: NSNetService, didNotPublish errorDict: [NSObject : AnyObject]) { 
    println("didNotPublish:\(sender)"); 
} 

func netServiceDidPublish(sender: NSNetService) { 
    println("netServiceDidPublish:\(sender)"); 
} 

func netServiceWillResolve(sender: NSNetService) { 
    println("netServiceWillResolve:\(sender)"); 
} 

func netService(sender: NSNetService, didNotResolve errorDict: [NSObject : AnyObject]) { 
    println("netServiceDidNotResolve:\(sender)"); 
} 

func netServiceDidResolveAddress(sender: NSNetService) { 
    println("netServiceDidResolve:\(sender)"); 
} 

func netService(sender: NSNetService, didUpdateTXTRecordData data: NSData) { 
    println("netServiceDidUpdateTXTRecordData:\(sender)"); 
} 

func netServiceDidStop(sender: NSNetService) { 
    println("netServiceDidStopService:\(sender)"); 
} 

func netService(sender: NSNetService, 
    didAcceptConnectionWithInputStream inputStream: NSInputStream, 
    outputStream stream: NSOutputStream) { 
     println("netServiceDidAcceptConnection:\(sender)"); 
} 
} 

class BMBrowserDelegate : NSObject, NSNetServiceBrowserDelegate { 

func netServiceBrowser(netServiceBrowser: NSNetServiceBrowser, 
          didFindDomain domainName: String, 
          moreComing moreDomainsComing: Bool) { 
    println("netServiceDidFindDomain") 
} 

func netServiceBrowser(netServiceBrowser: NSNetServiceBrowser, 
          didRemoveDomain domainName: String, 
          moreComing moreDomainsComing: Bool) { 
    println("netServiceDidRemoveDomain") 
} 

func netServiceBrowser(netServiceBrowser: NSNetServiceBrowser, 
    didFindService netService: NSNetService, 
    moreComing moreServicesComing: Bool) { 
     println("netServiceDidFindService") 
} 

func netServiceBrowser(netServiceBrowser: NSNetServiceBrowser, 
    didRemoveService netService: NSNetService, 
    moreComing moreServicesComing: Bool) { 
     println("netServiceDidRemoveService") 
} 

func netServiceBrowserWillSearch(aNetServiceBrowser: NSNetServiceBrowser!){ 
    println("netServiceBrowserWillSearch") 
} 

func netServiceBrowser(netServiceBrowser: NSNetServiceBrowser, 
    didNotSearch errorInfo: [NSObject : AnyObject]) { 
     println("netServiceDidNotSearch") 
} 

func netServiceBrowserDidStopSearch(netServiceBrowser: NSNetServiceBrowser) { 
    println("netServiceDidStopSearch") 
} 

}