Я пытаюсь подключиться к каналу с идентификатором комнаты и с помощью действия onReceive, которое я ожидаю получить некоторые данные. Я сделал это на Android и прекрасно работает, но на iOS это всегда дает мне неудачный ответ. Я пытался преобразовать свой код Android в iOS, но я не уверен, что что-то упустил. Ниже мой метод Android, который работает.
private void subscribe() throws URISyntaxException {
URI uri = new URI("wss://mycompany.com/cable");
Consumer.Options options=new Consumer.Options();
options.headers = new ArrayMap<>();
options.headers.put("Origin","https://mycompany.com");
Consumer consumer = ActionCable.createConsumer(uri,options);
// 2. Create subscription
Channel appearanceChannel = new Channel("RoomChannel");
appearanceChannel.addParam("room_id",randomString);
Subscription subscription = consumer.getSubscriptions().create(appearanceChannel);
subscription
.onConnected(new Subscription.ConnectedCallback() {
@Override
public void call() {
// Called when the subscription has been successfully completed
}
}).onRejected(new Subscription.RejectedCallback() {
@Override
public void call() {
// Called when the subscription is rejected by the server
}
}).onReceived(new Subscription.ReceivedCallback() {
@Override
public void call(JsonElement data) {
//I get the data response here
return;
}
}).onDisconnected(new Subscription.DisconnectedCallback() {
@Override
public void call() {
// Called when the subscription has been closed
}
}).onFailed(new Subscription.FailedCallback() {
@Override
public void call(ActionCableException e) {
// Called when the subscription encounters any error
}
});
// 3. Establish connection
try {
consumer.connect();
// 4. Perform any action
subscription.perform("away");
// 5. Perform any action using JsonObject(GSON)
JsonObject params = new JsonObject();
params.addProperty("foo", "bar");
subscription.perform("appear", params);
}catch (Exception e)
{
Log.e("------error",e);
}
}
Это мой метод iOS
let url = "wss://mycompany.com/cable"
let ChannelIdentifier = "RoomChannel"
func setupActionCable(){
guard let urlString = URL(string: url) else {return}
let headers = ["Origin":"https://mycompany.com"]
self.client = ActionCableClient(url: urlString, headers:headers)
self.client?.willConnect = {
print("Will Connect")
}
self.client?.onConnected = {
print("Connected to \(String(describing: self.client?.url))")
}
self.client?.onDisconnected = {(error: ConnectionError?) in
print("Disconected with error: \(String(describing: error))")
}
self.client?.willReconnect = {
print("Reconnecting to \(String(describing: self.client?.url))")
return true
}
}
func subscribe(_ roomId:String){
let room_identifier = ["room_id" : roomId]
self.channel = client?.create(ChannelIdentifier, identifier: room_identifier)
self.channel?.onSubscribed = {
print("Subscribed to \(self.ChannelIdentifier) with room Id = \(roomId)")
}
self.channel?.onReceive = {(data: Any?, error: Error?) in
print("****** channel response data = \(String(describing: data))")
if let error = error {
print(error.localizedDescription)
return
}
}
}
Я звоню setupActionCable
на viewDidLoad
, и после этого, когда я получаю roomId, я звоню на subscribe
с roomId. Но здесь я всегда получаю ответ как
message = {
state = FAILED;
};
Но в Android я получаю ответ json в сообщении. Я не уверен, что мне здесь не хватает при конвертации в iOS. Любая помощь приветствуется.
PS: я имею в виду это для Android и это для iOS.