2017-11-14 1 views
2

사용자가 특정 봉쥬르에있는 모든 장치를 검색 할 수있는 옵션으로 사용 가능한 모든 bonjour 서비스 목록을 검색 할 스캐너 클래스가 있습니다. 서비스 이름.스위프트 : 내 노트북이 내 노트북에 도킹되지 않은 경우 모든 bonjour 서비스 목록을 볼 수 없습니다.

모든 것이 효과적입니다. 내가 케이블에서 내 아이폰을 제거 할 때를 제외하고 나는 모든 봉쥬르 서비스를 볼 수 없다.

모든 아이디어 y?

참고 : 내 아이폰은 동일한 네트워크에서 wifi를 통해 연결된 모든 노트북입니다. 하지만 그것은 아이폰이 내 노트북을 통해 bonjour 서비스를 감지하는 것 같습니다.

여기 내 수업입니다. 수업 준비가 확실하지 않습니다.

class ScannerViewController: UIViewController { 

@IBOutlet weak var serviceTextField: UITextField! 
@IBOutlet weak var transportLayerTextField: UITextField! 
@IBOutlet weak var domainTextField: UITextField! 

@IBOutlet weak var tableView: UITableView! 

@IBOutlet weak var allBonjourBtn: UIButton! 
@IBOutlet weak var searchBtn: UIButton! 

let searchForAllString = "_services._dns-sd._udp." 

var services = [NetService](){ 
    didSet{ 
     self.tableView.reloadData() 
    } 
} 

private lazy var serviceBrowser = NetServiceBrowser() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.tableView.estimatedRowHeight = 150 
    self.tableView.rowHeight = UITableViewAutomaticDimension 

    self.serviceBrowser.delegate = self 
    self.searchBtn.makeCircularEdges() 
    self.allBonjourBtn.makeCircularEdges() 
} 

@IBAction func allBonjourPressed(_ sender: UIButton) { 
    self.startBrowsing(all: true) 
} 

@IBAction func searchPressed(_ sender: UIButton) { 
    self.startBrowsing(all: false) 
} 

func setBrowserObj() -> (serviceName: String, transportLayer: String, domain: String){ 

    let sName = (self.serviceTextField?.text ?? "").trim 
    let tl = (self.transportLayerTextField?.text ?? "").trim 

    let text = (self.domainTextField?.text ?? "").trim 
    let domain = (text == "" ? text: "\(text).") 
    print("\(sName).\(tl).", domain) 
    return (serviceName: "_\(sName)", transportLayer: "_\(tl)", domain: "\(domain)") 
} 

func startBrowsing(all: Bool){ 
    self.hideKeyboard() 
    self.serviceBrowser.stop() 
    self.services = [] 
    let result = self.setBrowserObj() 
    self.serviceBrowser.delegate = self 
    if all { 
     self.serviceBrowser.searchForServices(ofType: searchForAllString, inDomain: "\(result.domain)") 
    }else{ 
     self.serviceBrowser.searchForServices(ofType: "\(result.serviceName).\(result.transportLayer).", inDomain: "\(result.domain)") 
    } 
} 
} 

extension ScannerViewController: UITableViewDelegate, UITableViewDataSource { 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.services.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else{ 
     return UITableViewCell() 
    } 

    guard self.services.count > 0 else{ 
     return cell 
    } 
    let service = self.services[indexPath.row] 
    cell.textLabel?.text = "Name: \(service.name)\nDomain: \(service.domain)\nPort: \(service.port)" 
    return cell 
} 
} 

extension ScannerViewController: UITextFieldDelegate { 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    let nextTag = textField.tag + 1 
    if let nextTextField = textField.superview?.viewWithTag(nextTag) { 
     nextTextField.becomeFirstResponder() 
    }else{ 
     self.hideKeyboard() 
    } 
    return false 
} 

func hideKeyboard() { 
    self.serviceTextField?.resignFirstResponder() 
    self.transportLayerTextField?.resignFirstResponder() 
    self.domainTextField?.resignFirstResponder() 
} 
} 

extension ScannerViewController: NetServiceBrowserDelegate, NetServiceDelegate { 

func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) { 
    print("Error serching for service") 
    print("Errors: \(errorDict.keys)\n") 
} 

func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { 
    service.delegate = self 
    self.services.append(service) 
} 

func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) { 
    service.delegate = nil 
    self.removeServiceFromList(serviceObj: service) 
} 

///Removes the service from the current list. 
func removeServiceFromList(serviceObj: NetService){ 
    for (index, sev) in self.services.enumerated() { 
     if sev == serviceObj { 
      self.services.remove(at: index) 
     } 
    } 
} 

} 

enter image description here

업데이트 :

내가 사용할 수있는 봉쥬르 서비스를 확인하기 위해 명령 줄을 사용하고 내가 발견했습니다 :

  1. 중 몇 가지를 나열합니다 dns-sd -B _services._dns-sd._udp local. 실행 내가 믿는 서비스는 내 컴퓨터에서만 브로드 캐스팅됩니다.

  2. dns-sd -B _ipp._tcp local. 또는 dns-sd -B _http._tcp local.ipp/http 서비스를 사용하는 모든 것을 나열합니다.

내가 명령 dns-sd -B _services._dns-sd._udp local.을 사용하면 ipp 또는 http 서비스 유형이 나타나지 않은 이유 진짜 문제 ??? 모든 나의 독서에 온라인으로 모두는이 명령이 네트워크에 availble 그리고 활동적인 모든 bonjour 서비스를 목록으로 만들어야 한 ㄴ다고 말하는 모두! 하지만 그건 나에게 일어나는 일이 아닙니다.

참고 : 저는 wifi를 통해 네트워크에 연결되어 있으며 어댑터가 없으므로 케이블을 사용할 수 없습니다.

결과의 스냅 샷을 첨부했습니다. 2

enter image description here


업데이트 마지막으로 나는 그것을 알아 냈어. 나는 서비스 목록을 차단하고 있던 와이파이 네트워크에 문제가 있다고 생각한다. 내가 집에서 시험해 보았을 때 아무런 문제없이 모든 봉쥬르 (bonjour) 서비스를 볼 수 있었기 때문에.

+0

을이 알아낼 "하지만 아이폰이 내 노트북을 통해 봉쥬르 서비스를 감지 것 같다"는 아이폰과 중요한 노트북, 또는 당신이 실행하는 것이 사실 사이의 _connection_가 도움이 app _from Xcode_에서 장치가 아닌?다른 말로하면, 만약 당신이 연결되어 있지만 Xcode가 그것을 실행하도록 지시하는 것보다 발판을 두드리는 것에 의해 당신이 app을 실행한다면? – matt

+0

xcode를 사용하지 않고 앱을 정상적으로 실행하면 모든 bonjour 서비스 목록을 볼 수 없습니다! 하지만 당신이 당신의 전화를 충전하는 것처럼 내가 케이블을 때렸다면 나는 모든 서비스를 탐지 할 수 있습니다. 사실 내 랩톱과 내 아이폰이 서로 다른 와이파이에 연결되어 있어도 아이폰과 랩탑 사이에 케이블이 연결되어있는 한 모든 서비스를 볼 수 있습니다. –

+0

모든 라디오가 장치에서 작동합니까? 혹시 블루투스를 끄지 않았습니까? 비행기 모드가 아니니? 여기 빨대에서 파악 : 나는 어떤 방법으로도 Bonjour 전문가가 아니야. – matt

답변

0

마침내 나는 그것을 알아낼 수 있었고 이것을 막고 있던 것은 내 직장에서 무선 네트워크였다. 집에서해볼 때 모든 것이 예상대로 작동합니다. 모두를위한

덕분에 나를

관련 문제