Swift - Получить XML-контент в локальной сети с ошибкой -1004 - PullRequest
0 голосов
/ 05 октября 2018

Я создаю функцию для получения содержимого XML в локальной сети с помощью Alamofire.

private func discover(from ip: String, completion: @escaping () -> Void) {
    let url = ip.url(file: "discover.xml")

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

    let manager = Alamofire.SessionManager.default
    //        manager.session.configuration.httpShouldUsePipelining = true
    manager.session.configuration.timeoutIntervalForRequest = 5.0
    manager.session.configuration.timeoutIntervalForResource = 5.0

    manager.request(request).responseData { [weak self] (response) in
        guard let strongSelf = self else { return }

        defer {
            completion()
        }

        switch response.result {
        case .success(_):
            print("success")

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

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

И использую ее, как показано ниже:

@IBAction func scan1(_ sender: Any) {
    let ip = "192.168.1.105:17171" // I'm sure my server already worked on port `17171`

    discover(from: ip) {
        print("done -> check!")
    }
}

Однако я могу просто получить ошибку -1004:

2018-10-05 18:07:34.393450+0700 LANScan[205:3504] Task <CCDD5C95-2C7E-408B-AD1B-BA54EFAA2F70>.<511> load failed with error Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={_kCFStreamErrorCodeKey=61, NSUnderlyingError=0x282b5eeb0 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <CCDD5C95-2C7E-408B-AD1B-BA54EFAA2F70>.<511>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <CCDD5C95-2C7E-408B-AD1B-BA54EFAA2F70>.<511>"
), NSLocalizedDescription=Could not connect to the server., NSErrorFailingURLStringKey=http://192.168.1.105:17171/discover.xml?rand=3209938829, NSErrorFailingURLKey=http://192.168.1.105:17171/discover.xml?rand=3209938829, _kCFStreamErrorDomainKey=1} [-1004]
[LANUser] failed with IP: 192.168.1.105:17171 => Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={_kCFStreamErrorCodeKey=61, NSUnderlyingError=0x282b5eeb0 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <CCDD5C95-2C7E-408B-AD1B-BA54EFAA2F70>.<511>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <CCDD5C95-2C7E-408B-AD1B-BA54EFAA2F70>.<511>"
), NSLocalizedDescription=Could not connect to the server., NSErrorFailingURLStringKey=http://192.168.1.105:17171/discover.xml?rand=3209938829, NSErrorFailingURLKey=http://192.168.1.105:17171/discover.xml?rand=3209938829, _kCFStreamErrorDomainKey=1}
done -> check!

Я также Allow Arbitrary Loads и Arbitrary Loads in Web Content (ниже), но это все равно не помогает:

App Transport Security Settings

Что мешает мне получить контент XML от 192.168.1.105?Есть ли какие-либо другие параметры, которые я должен включить, чтобы он работал?

Заранее спасибо,

РЕДАКТИРОВАТЬ: Добавить порт 17171, как @wottle указал

1 Ответ

0 голосов
/ 10 октября 2018

ATS не блокирует это соединение.Первым шагом к устранению неполадок является попытка загрузить URL-адрес в Safari на устройство.Я подозреваю, что вы можете получить доступ к URL с вашего компьютера разработчика, но устройство iOS заблокировано от доступа к серверу.

Как правило, загрузите http://192.168.1.105:17171/discover.xml?rand=00000 в Safari и посмотрите, нет ли ошибки.

Если он не может загрузить , убедитесь, что ваше устройство iOS находится в той же сети, что и устройство 192.168.1.105.Также убедитесь, что нет правил брандмауэра, которые блокировали бы трафик.Существует множество причин, по которым вы не можете проверить, поэтому вам необходимо предоставить более подробную информацию, если оказывается, что вы не можете подключиться (я подозреваю, что вы не можете).Одна вещь, которую вы можете проверить, это то, что у вас отключен Wi-Fi Assist.Если ваш сигнал Wi-Fi слабый, он может использовать сотовую связь.

Если он успешно загружается , возможно, что-то не так с вашим кодом.Кажется, у вас есть разница в выполняемом коде и в коде, который вы показываете.Обратите внимание, что в вашем коде порт для сервера указан как 17171, но при сетевой ошибке используется порт по умолчанию (80), поскольку он не указывает порт в ошибке (см .: NSErrorFailingURLStringKey=http:// 192.168.1.105./discover.xml?rand=3209938829) Вы меняли код между публикацией и запуском.Убедитесь, что это соответствует.Кажется, что ваш код ничего не делает для удаления порта, но дважды проверьте, что URL, который фактически загружается, совпадает с URL, который вы смогли успешно загрузить в Safari.

...