Swift 将iOS上的Apollo订阅与WebSocket后端使用的Action Cable集成
我试图让iOS上的后端使用Action Cable来实现WebSocket。我了解到iOS应用程序需要将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
命令
、频道
和频道id
发送到后端才能使订阅生效()。在初始化Apollo实例时,我尝试在WebSocketTransport.swift的WebSocketTransport对象上使用函数writefunc 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和您的问题上有报道