Swift Alamofire обнаруживают в локальной сети - PullRequest
0 голосов
/ 29 сентября 2018

В моей локальной сети я запускаю следующую команду терминала на 6 компьютерах MAC, чтобы разместить папку, в которой находится discover.xml:

python -m SimpleHTTPServer 17171

В моем приложении с установленным Alamofire я запускаю этот кодчтобы получить discover.xml контент:

extension String {
    func url(file: String) -> URL {
        return URL(string: "http://\(self)/\(file)?rand=\(arc4random())")! // `rand` to make sure no cached content
    }
}

func discover(from ip: String, completion: @escaping () -> Void) {
     let url = ip.url(file: "discover.xml") // ip passed in: "192.168.1.15:17171" for ex

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.timeoutInterval = 6.0 // !

    let manager = Alamofire.SessionManager.default
    manager.session.configuration.timeoutIntervalForRequest = 6.0
    manager.session.configuration.timeoutIntervalForResource = 6.0

    manager.request(request).responseData { (response) in
        switch response.result {
        case .success(let d):
            // do my stuff on `multiX`

        case .failure(let error):
            print("failed with IP: \(ip) => \(error)")
        }
    }        
} 

Ниже я узнаю:

private func discover(on subnet: String) { // subnet: 192.168.1
    let group = DispatchGroup()

    for i in 1..<256 {
        let ip = subnet + ".\(i):17171"

        group.enter()
        discover(from: ip) {
            group.leave()
        }
    }

    group.notify(queue: DispatchQueue.main) { [weak self] in
        guard let strongSelf = self else { return }

        print("all done: \(strongSelf.multiX.count)") // just can discover 2, or 3, or 4 !!
        strongSelf.tableView.reloadData()
    }
}   

Почему в большинстве случаев я не могу получить 6 discover.xml с 6 MACкомпьютеры?(Я могу получить только 2 или 3, или 4).Результат, который я получаю, не является постоянным.Скажем, у меня есть 6 компьютеров MAC, работающих под управлением python -m ... с именами: A, B, C, D, E, F. Иногда я могу получить только: A, B, D, иногда C, F, ...

При запросе к остальным компьютерам, на которых размещен discover.xml, всегда возникает ошибка failed with IP: x.x.x.x:17171 => Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." (я уверен, что отсутствующие компьютеры успешно получили IP-адрес)

Можно ли обнаружить всю подсеть, используя мой метод, описанный выше?(то есть использование цикла for для итерации каждого ip).Является ли 6 секунд разумным временем ожидания?

РЕДАКТИРОВАТЬ:

Я пытался разрешить все в ATS, но все не лучше

ATS

Что на самом деле мешает мне запрашивать discover.xml на компьютерах MAC?

Спасибо,

...