Swift 将iOS上的Apollo订阅与WebSocket后端使用的Action Cable集成

Swift 将iOS上的Apollo订阅与WebSocket后端使用的Action Cable集成,swift,websocket,apollo,actioncable,starscream,Swift,Websocket,Apollo,Actioncable,Starscream,我试图让iOS上的后端使用Action Cable来实现WebSocket。我了解到iOS应用程序需要将命令、频道和频道id发送到后端才能使订阅生效()。在初始化Apollo实例时,我尝试在WebSocketTransport.swift的WebSocketTransport对象上使用函数writefunc write(str:String,force-forced:Bool=false,id:Int?=nil)。下面你可以看到我是怎么做的 let userDefault = U

我试图让iOS上的后端使用Action Cable来实现WebSocket。我了解到iOS应用程序需要将
命令
频道
频道id
发送到后端才能使订阅生效()。在初始化Apollo实例时,我尝试在WebSocketTransport.swift的WebSocketTransport对象上使用函数write
func write(str:String,force-forced:Bool=false,id:Int?=nil)
。下面你可以看到我是怎么做的

        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)
    }()
let userDefault=UserDefaults.standard
var authPayloads=字典()
var authToken=“”
如果let token=userDefault.object(forKey:“token”){
authToken=“\(令牌)”
authPayloads.updateValue(authToken,forKey:“授权”)
}
let configuration=URLSessionConfiguration.default
configuration.httpAdditionalHeaders=authPayloads
let map:GraphQLMap=authPayloads
让wsEndpointURL=URL(字符串:“ws://localhost:8080/subscriptions/\(authToken)”)!
让endpointURL=URL(字符串:http://localhost:8080/api")!
websocket=WebSocketTransport(请求:URLRequest(url:wsEndpointURL),连接负载:map)
var channelId=Int(arc4random_统一(100000))
websocket?.write(stringify(json:[“命令”:“订阅”,“标识符”:stringify(json:[“频道”:“频道名称”,“频道ID”:频道ID]))
设splitNetworkTransport=splitNetworkTransport(
httpNetworkTransport:httpNetworkTransport(
url:endpointURL,
配置:配置
),
websocket网络传输:websocket!
)
返回客户端(networkTransport:splitNetworkTransport)
}()

但是,后端没有看到我在他们的日志中向WebSocket传输对象写入的内容,并且我无法订阅该特定通道。如果后端使用Action Cable,我可以在iOS上使用Apollo订阅,并使两者协同工作吗?

目前唯一的解决方案是使用接收流,并使用来自Apollo客户端的突变/查询

真不幸阿波罗iOS不知道如何与ActionCable频道沟通,这个问题在阿波罗iOS和您的问题上有报道