Я создал http-сервер на python, который работает как положено (отвечает на json как строку) и URLSession
в Swift, который должен получить этот json. Моя проблема в том, что Apple требует HTTP-соединения для использования HTTPS.
App Transport Security (ATS)
Начиная с iOS 9.0 и OS X 10.11, новая функция безопасности, называемая App Transport Security (ATS), включена по умолчанию для всех HTTP-соединений, выполненных с помощью URLSession. ATS требует, чтобы HTTP-соединения использовали HTTPS (RFC 2818).
Для получения дополнительной информации посмотрите NSAppTransportSecurity в Ссылке ключа Списка свойств информации.
См .: https://developer.apple.com/documentation/foundation/urlsession
Это код для моего сервера Python:
import http.server
import ssl
import json
class RequestHandler(http.server.BaseHTTPRequestHandler):
def set_headers(self):
self.send_response(200)
self.end_headers()
def do_GET(self):
self.set_headers()
self.wfile.write(json.dumps({
'title': 'title'
}).encode())
port = 8888
host = ''
with http.server.HTTPServer((host, port), RequestHandler) as httpd:
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile='key.pem', certfile='cert.pem', server_side=True)
print('server serves on {}:{}'.format(host, port))
httpd.serve_forever()
Это команда, которую я использовал для создания файлов сертификатов и ключей: openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
. Когда я запускаю файл сервера python, мне нужно ввести пароль PEM, поэтому я предполагаю, что это сработало.
А это мой код Swift для URLSession
:
let url = URL(string: "http://localhost:8888")!
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let dataTask = session.dataTask(with: url) { (data, response, error) in
guard error != nil else {
print("\(error!.localizedDescription)")
return
}
guard data != nil else {
print("no data")
return
}
print(String(data: data!, encoding: .utf8)!)
}
dataTask.resume()
Когда я запускаю код Python, а затем код Swift, Xcode выдает мне ошибку и печатает нет данных . Ошибка: не удается запустить загрузку задачи ... <1>, поскольку она не соответствует политике ATS
Обратите внимание, что я хочу, чтобы мой python-сервер соответствовал политике ATS, а НЕ добавлял исключения домена или ключ NSAllowsLocalNetworking
в мой info.plist.
PS: Модуль ssl
и ssl.wrap_socket(...
были попыткой заставить мой HTTP-сервер соответствовать политике ATS.