除非我先发布消息,否则无法接收 PubNub 消息



在我的 Swift 应用程序中,我在 viewDidLoad 上实例化 PubNub正确配置,然后加入频道。但是,看起来好像根本不加入频道,除非我触发发送按钮操作发送消息(我在发送按钮中扔了配置/加入通道代码只是为了看看它是否有效)。发送按钮函数中的代码是与 viewDidLoad 中的代码相同,但 viewDidLoad 中的代码是还是被忽略了。这很令人沮丧,因为我的应用程序的当前用户不会接收发送到通道的消息,除非用户首先发送消息。

这是视图控制器中的代码(我删除了很多代码,以便于查看。如果您认为问题出在其他地方,我可以发布更多):

class MessageViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, PNObjectEventListener{
    var pubNub: PubNub!
    var pnConfiguration: PNConfiguration!
    var ids: String = ""
@IBAction func sendButton(sender: UIButton) {
        //create Pubnub channel
        pnConfiguration = PNConfiguration(publishKey: "key", subscribeKey: "key")
        pnConfiguration.uuid = currentUser.objectId!
        print(pnConfiguration.uuid)
        pubNub = PubNub.clientWithConfiguration(pnConfiguration)
        let channelName = ids as String
        let channelArray: [String] = [channelName]
        pubNub.subscribeToChannels(channelArray, withPresence: true)
        pubNub.publish(self.messageText.text!, toChannel: channelName, compressed: false, withCompletion: nil)
        pubNub.addListener(self)
        self.messageText.enabled = true
        self.view.userInteractionEnabled = true
        dispatch_async(dispatch_get_main_queue()) {
            self.messageText.text = ""
            self.messageTableView.reloadData()
        }
    }
override func viewDidLoad() {
        super.viewDidLoad()
        //Query that sets self.ids = user1.objectId! + user2.objectId!
        //set Pubnub config
        pnConfiguration = PNConfiguration(publishKey: "key", subscribeKey: "key")
        pubNub = PubNub.clientWithConfiguration(pnConfiguration)
        pnConfiguration.uuid = currentUser.objectId!
        //create channel
        let channelName = ids as String
        print(channelName)
        let channelArray: [String] = [channelName]
        pubNub.subscribeToChannels(channelArray, withPresence: true)
        pubNub.addListener(self)
        dispatch_async(dispatch_get_main_queue()) {
            self.messageTableView.reloadData()
        }
    }

编辑:

查看日志后,看起来它不起作用的原因似乎是因为它加入了一个名为"的频道,即使print(channelName)返回真实的频道名称。为什么不采用频道名称?它不是正确的数据类型吗?

在您的代码片段中,我没有看到您在第 #7 行声明的 ids 变量设置实际值的任何地方。因此,存储在该变量中的客户端使用值:""
我认为这个变量在控制器生命周期中发生了变化,并在您点击 sendButton 之前设置为适当的值,但在加载视图时不可用。

此致敬意谢尔盖

最新更新