Проблема, которую нужно решить: я пытался изменить коды, в которых создаю HTTP. (s) сервер и продвигаем его на сервер WebSocket, чтобы в конечном итоге заставить приложение iOS подключаться к новому HTTP-серверу WebSocket.
Справочная информация: инженер-программист, написавший код приложения iOS. сказал, что это было написано для подключения к Сервер SimpleWebsocket (HTTP) использует встроенную поддержку Websocket в iOS через «URLSessionWebsocketTask», и с момента обновления версии iOS на iPhone он не может подключиться к HTTP-серверу.
Коды для приложения iOS находятся в формате .swift и используют XCode для компиляции и загрузки приложения на iPhone. Создание сервера WebSocket происходит в .py вместе с контроллером графического интерфейса приложения.
Изначально, чтобы все работало, я бы настроил сервер WebSocket с помощью Ubuntu из сценария Python. поскольку я управляю приложением iOS через другой драйвер сценария Python, который предоставляет графический интерфейс для управления приложением на компьютере с Windows (компьютер также предоставляет мобильную точку доступа, к которой подключается iPhone для возможности подключения к серверу).< /p>
Изменения по порядку после моей попытки преобразовать HTTP-сервер в HTTP(S):
- Создан самозаверяющий сертификат SSL с IP-адресом мобильной точки доступа в качестве общего имени.
- Самозаверяющий SSL-сертификат на iPhone загружен и проверен.
- Изменен файл WebSocketClient.py. который запускается в Ubuntu для принятия и использования сертификата SSL (это показывает, что сервер Secure WebSocket запущен на введенном порту)
- Обновлен Сценарий Python Driver.py (графический интерфейс для управления приложением iOS) на компьютере Windows для подключения к Secure WebSocket Server (это также показывает, что он подключен к Secure WebSocket Server)
- Здесь все выглядит хорошо точка
- Теперь, после того как я подключаюсь к мобильной точке доступа с компьютера Windows, я перехожу к приложению iPhone iOS, где ему необходимо подключиться к сервер, поэтому в быстром коде приложения iOS для подключения к серверу я изменил исходный ws:// на wss:// и повторно загрузил приложение на iPhone, но оно не может подключиться к серверу (в Терминал Ubuntu, он будет показывать, если он подключается, но сейчас ничего не происходит).
- При отладке подключения к серверу WebSocket возникает следующая ошибка: Error Domain=NSURLErrorDomain Code=-1009 «Подключение к Интернету отключено».< /strong>
Я точно знаю, что мобильная точка доступа имеет подключение к Интернету, так как я использовал DropBox, чтобы получить cert.pem для сертификации SSL, чтобы доверять ей
Я точно знаю, что мобильная точка доступа имеет подключение к Интернету, поскольку я использовал DropBox, чтобы получить сертификат SSL. li>
Основываясь на этих попытках, чего мне не хватает в моих действиях по подключению приложения iOS/iPhone к серверу HTTP(S)? Нужно ли мне добавлять изменения в info.plist приложения iOS (список свойств информации) для работы с HTTP(s) вместе с WebSocketConnection.swift приложения iOS? Заранее спасибо.
Коды для приложения iOS, которые, по моему мнению, имеют отношение к WebSocketServer:
Info.plist, куда я добавил строки (не уверен, правильно ли). :
Код: Выделить всё
NSAppTransportSecurity:
Код: Выделить всё
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
$(PRODUCT_NAME)
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
1.0
CFBundleVersion
1
LSRequiresIPhoneOS
NSCameraUsageDescription
ARKit live camera
NSLocationWhenInUseUsageDescription
for image anchor
NSAppTransportSecurity
NSAllowsArbitraryLoads
NSAllowsLocalNetworking
NSExceptionDomains
192.168.137.1
NSExceptionAllowsInsecureHTTPLoads
NSExceptionMinimumTLSVersion
TLSv1.2
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
UIApplicationSceneManifest
UIApplicationSupportsMultipleScenes
UISceneConfigurations
UIWindowSceneSessionRoleApplication
UISceneConfigurationName
Default Configuration
UISceneDelegateClassName
$(PRODUCT_MODULE_NAME).SceneDelegate
UISceneStoryboardFile
Main
UIApplicationSupportsIndirectInputEvents
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
Main
UIRequiredDeviceCapabilities
armv7
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
Код: Выделить всё
//
// WebSocketConnection.swift
// WebSockets
//
// Created by zen on 6/17/19.
// Copyright © 2019 AppSpector. All rights reserved.
//
import Foundation
import Combine
protocol WebSocketConnection {
func send(text: String)
func send(data: Data)
func connect()
func disconnect()
var delegate: WebSocketConnectionDelegate? {
get
set
}
}
protocol WebSocketConnectionDelegate {
func onConnected(connection: WebSocketConnection)
func onDisconnected(connection: WebSocketConnection, error: Error?)
func onError(connection: WebSocketConnection, error: Error)
func onMessage(connection: WebSocketConnection, text: String)
func onMessage(connection: WebSocketConnection, data: Data)
}
class WebSocketTaskConnection: NSObject, WebSocketConnection, URLSessionWebSocketDelegate {
var delegate: WebSocketConnectionDelegate?
var webSocketTask: URLSessionWebSocketTask!
var urlSession: URLSession!
let delegateQueue = OperationQueue()
// Commented out below - ML 11/18/2024
// init(url: URL) {
// super.init()
// urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: delegateQueue)
// webSocketTask = urlSession.webSocketTask(with: url)
// }
// Updated init() for configuration with SSL - ML 11/18/2024
init(url: URL) {
super.init()
// Create URLSession configuration with SSL settings
let config = URLSessionConfiguration.default
config.timeoutIntervalForResource = 30 // Adjust timeout if needed
urlSession = URLSession(configuration: config,
delegate: self,
delegateQueue: delegateQueue)
// Create WebSocket task with the URL
var request = URLRequest(url: url)
request.setValue("", forHTTPHeaderField: "Origin") // Handle any CORS issues
webSocketTask = urlSession.webSocketTask(with: request)
}
func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {
self.delegate?.onConnected(connection: self)
}
func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {
self.delegate?.onDisconnected(connection: self, error: nil)
}
// Added additional func urlSession() to accept/trust SSL - ML 11/18/2024
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
let serverTrust = challenge.protectionSpace.serverTrust else {
completionHandler(.performDefaultHandling, nil)
return
}
let credential = URLCredential(trust: serverTrust)
completionHandler(.useCredential, credential)
}
func connect() {
webSocketTask.resume()
listen()
}
func disconnect() {
webSocketTask.cancel(with: .goingAway, reason: nil)
}
func listen() {
webSocketTask.receive { result in
switch result {
case .failure(let error):
self.delegate?.onError(connection: self, error: error)
case .success(let message):
switch message {
case .string(let text):
self.delegate?.onMessage(connection: self, text: text)
case .data(let data):
self.delegate?.onMessage(connection: self, data: data)
@unknown default:
fatalError()
}
self.listen()
}
}
}
func send(text: String) {
webSocketTask.send(URLSessionWebSocketTask.Message.string(text)) { error in
if let error = error {
self.delegate?.onError(connection: self, error: error)
}
}
}
func send(data: Data) {
webSocketTask.send(URLSessionWebSocketTask.Message.data(data)) { error in
if let error = error {
self.delegate?.onError(connection: self, error: error)
}
}
}
}
Я могу подключить приложение iOS/iPhone к пользовательскому серверу SSL и обмениваться данными, но получаю ошибку -1001 «Запрос тайм-аут» через 30 секунд.
Архитектура:
- ПК под управлением Windows под управлением Ubuntu (WSL), на котором размещен сервер WebSocket с самоподписавшийся SSL
- Приложение Python с графическим интерфейсом в качестве клиента для управления приложением iOS
- Приложение iOS в качестве другого клиента на физическом iPhone
< li>Сервер работает по адресу wss://192.168.137.1:8001 (это IP-адрес мобильной точки доступа с ПК с Windows, к которому также необходимо подключить iPhone)
- ✓ Сервер успешно создан и работает.
- ✓ Графический интерфейс Python подключается и работает правильно.
- ✓ Приложение iOS первоначально подключается и обменивается данными в течение 30 секунд.
- ✗ Время соединения iOS истекает через 30 секунд.
- ✗ Обновления карт из графического интерфейса. не синхронизировать с приложением iOS
Код: Выделить всё
WebSocket: Received text message
2024-11-25 15:49:03.678384-0800 iVEERS[1465:454666] Task . finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2103, _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask ., _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask ."
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=wss://192.168.137.1:8001/, NSErrorFailingURLKey=wss://192.168.137.1:8001/, _kCFStreamErrorDomainKey=4}
- Использование встроенного URLSessionWebSocketTask iOS для подключения через WebSocket
< li>Самозаверяющий SSL-сертификат - Настройки безопасности транспорта, настроенные в Info.plist
- Обновления карт используют данные PNG в кодировке Base64
- Что вызывает тайм-аут через 30 секунд?
- Как поддерживать постоянный Соединение WebSocket?
- Почему обновления карт не распространяются на клиент iOS?
Подробнее здесь: https://stackoverflow.com/questions/792 ... -websocket
Мобильная версия