Swift Parse Live Query subscription not functioning for chat app, even though messages are logged and can be sent and received with request

20 views Asked by At

I'm trying to create a chat, but subscription doesn't work. I see server gets my messages in logs, I can send message, get messages with request, not query as needed

import Parse
import ParseLiveQuery

final class ViewController: UIViewController {
    var user: ECUser?
    var roomData: RoomData?
    var client = ParseLiveQuery.Client()
    var subscription : Subscription<PFObject>!
    let messageQuery = PFQuery(className: "Message")

    override func viewDidLoad() {
        super.viewDidLoad()
        self.login()
    }

    func observeMessage() {
        client.shouldPrintWebSocketLog = true
        client.shouldPrintWebSocketTrace = true

        subscription = client.subscribe(messageQuery)
            .handle(Event.created) { _, message in
                print("MY LOG: \(message)")
            }
            .handle(Event.deleted, { query, message in
                print("MY LOG: \(message)")
            })
            .handle(Event.updated, { query, message in
                print("MY LOG: \(message)")
            })
            .handle(Event.entered, { query, message in
                print("MY LOG: \(message)")
            })
            .handle(Event.left, { query, message in
                print("MY LOG: \(message)")
            })
    }

    private func initRoom() {
        let dataDictionary: [String: String] = [
            "hostname": "streaming-001-stand.edgestream.ru",
            "roomId": "serv27epdohpo",
            "type": "call"
        ]

        PFCloud.callFunction(inBackground: "initRoom", withParameters: dataDictionary) { (data, err) in
            guard err == nil else {
                print(err)
                return
            }
            guard let data = data as? [String: String] else { return }

            self.roomData = RoomData(id: data["id"], roomId: data["roomId"], type: data["type"])
            self.observeMessage()
        }
    }

    private func login() {
        let data: [String: Any] = [
            "authData": [
                "id": "XXX",
                "access_token": "XXX"
            ],
            "name": "Maksim",
            "role": "participant"
        ]

        PFCloud.callFunction(inBackground: "meetLogin", withParameters: data) {(data, err) in
            if err != nil {
                print(err!)
            } else {
                if let tokenData = data as? [String: String], let sessionToken = tokenData["sessionToken"] {
                    ECUser.become(inBackground: sessionToken) {(data, error) in
                        guard error == nil, let data else {
                            print(error)
                            return
                        }
                        self.initRoom()
                    }
                }
            }
        }
    }

    @IBAction func listen(_ sender: Any) {
        let messageQuery = PFQuery(className: "Message")
        messageQuery.limit = 1
        messageQuery.order(byDescending: "createdAt")
        messageQuery.includeKey("sender")
        messageQuery.findObjectsInBackground { (messages: [PFObject]?, error: Error?) in
            if let error = error {
                print("Error: \(error.localizedDescription)")
            } else if let messages = messages?.reversed() {
                for message in messages {
                    print(message)
                    if let content = message["content"] as? String, let sender = message["sender"] as? PFUser {
                        print("Sender: \(sender["name"] as? String)")
                        print("Message: \(content)")
                    }
                }
            }
        }
    }

    @IBAction func sendMessage(_ sender: Any) {
        let message = [
            "content": "321",
            "roomObjectId": self.roomData?.id!,
            "status": "fulfilled"
        ]

        PFCloud.callFunction(inBackground: "createMessage", withParameters: message) { (data, err) in
            guard err == nil else {
                print(err)
                return
            }
        }
    }
}

Hi there! I'm trying to create a chat, but subscription doesn't work. I see server gets my messages in logs, I can send message, get messages with request, not query as needed

0

There are 0 answers