사용자가 특정 봉쥬르에있는 모든 장치를 검색 할 수있는 옵션으로 사용 가능한 모든 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)
}
}
}
}
업데이트 :
내가 사용할 수있는 봉쥬르 서비스를 확인하기 위해 명령 줄을 사용하고 내가 발견했습니다 :
중 몇 가지를 나열합니다
dns-sd -B _services._dns-sd._udp local.
실행 내가 믿는 서비스는 내 컴퓨터에서만 브로드 캐스팅됩니다.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
업데이트 마지막으로 나는 그것을 알아 냈어. 나는 서비스 목록을 차단하고 있던 와이파이 네트워크에 문제가 있다고 생각한다. 내가 집에서 시험해 보았을 때 아무런 문제없이 모든 봉쥬르 (bonjour) 서비스를 볼 수 있었기 때문에.
을이 알아낼 "하지만 아이폰이 내 노트북을 통해 봉쥬르 서비스를 감지 것 같다"는 아이폰과 중요한 노트북, 또는 당신이 실행하는 것이 사실 사이의 _connection_가 도움이 app _from Xcode_에서 장치가 아닌?다른 말로하면, 만약 당신이 연결되어 있지만 Xcode가 그것을 실행하도록 지시하는 것보다 발판을 두드리는 것에 의해 당신이 app을 실행한다면? – matt
xcode를 사용하지 않고 앱을 정상적으로 실행하면 모든 bonjour 서비스 목록을 볼 수 없습니다! 하지만 당신이 당신의 전화를 충전하는 것처럼 내가 케이블을 때렸다면 나는 모든 서비스를 탐지 할 수 있습니다. 사실 내 랩톱과 내 아이폰이 서로 다른 와이파이에 연결되어 있어도 아이폰과 랩탑 사이에 케이블이 연결되어있는 한 모든 서비스를 볼 수 있습니다. –
모든 라디오가 장치에서 작동합니까? 혹시 블루투스를 끄지 않았습니까? 비행기 모드가 아니니? 여기 빨대에서 파악 : 나는 어떤 방법으로도 Bonjour 전문가가 아니야. – matt