Я пытаюсь заставить подписки Apollo на iOS работать с бэкэндом, который использует Action Cable для реализации веб-сокетов.Я узнал, что приложение iOS должно отправить command
, channel
и channel id
на сервер, чтобы подписки работали ( см. Здесь ).Я пытался использовать функцию записи func write(_ str: String, force forced: Bool = false, id: Int? = nil)
в WebSocketTransport.swift
на объекте WebSocketTransport при инициализации экземпляра Apollo.Ниже вы можете увидеть, как я это делаю.
let userDefault = UserDefaults.standard
var authPayloads = Dictionary<String, String> ()
var authToken = ""
if let token = userDefault.object(forKey: "token") {
authToken = "\(token)"
authPayloads.updateValue(authToken, forKey: "authorization")
}
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = authPayloads
let map: GraphQLMap = authPayloads
let wsEndpointURL = URL(string: "ws://localhost:8080/subscriptions/\(authToken)")!
let endpointURL = URL(string: "http://localhost:8080/api")!
websocket = WebSocketTransport(request: URLRequest(url: wsEndpointURL), connectingPayload: map)
var channelId = Int(arc4random_uniform(100000))
websocket?.write(stringify(json: ["command":"subscribe", "identifier": stringify(json: ["channel":"channelName", "channelId": channelId])]))
let splitNetworkTransport = SplitNetworkTransport(
httpNetworkTransport: HTTPNetworkTransport(
url: endpointURL,
configuration: configuration
),
webSocketNetworkTransport: websocket!
)
return ApolloClient(networkTransport: splitNetworkTransport)
}()
Однако сервер не видит, что я пишу в объект транспорта WebSocket в своих журналах, и я не могу подписаться на этот конкретный канал.Любая идея, как я могу использовать подписки Apollo на iOS, если бэкэнд использует Action Cable, и заставить их работать вместе?