【问题标题】:Can't receive PubNub message unless I publish a message first除非我先发布消息,否则无法接收 PubNub 消息
【发布时间】:2016-04-22 21:11:05
【问题描述】:

在我的 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) 返回了真实的频道名称。为什么不使用频道名称?是不是数据类型不对?

【问题讨论】:

    标签: ios swift pubnub


    【解决方案1】:

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

    最好的问候, 谢尔盖

    【讨论】:

    • 感谢您的帮助!这让我走上了正轨。出于某种原因,Pubnub 客户端在我的 ID 被设置为 Parse 查询之前进行了初始化。我将初始化代码移到了一个单独的函数中,现在在创建 ID 后立即调用该函数。那部分现在有效。但由于某种原因,我的消息 UUID 设置不正确。它忽略了我的 `pnConfiguration.uuid` 代码。它打印了正确的 UUID,但是当我实际发送消息时,客户端函数中的 message.uuid 返回一个非常不同的值
    • 我必须使用其他方法来设置消息 uuid 吗?除了 `pnConfiguration.uuid` 代码?
    • @james 说 uuid 用于调试目的并提供有关接收器客户端本身的信息。如果您需要让远程消息接收者知道用户 UUID - 您需要将其作为消息负载的一部分发送。
    • 我该怎么做?是否有特定的发布方法允许您设置 uuid?
    • @james 不,您只需发布字典,例如:@{@"message":@"my message",@"senderID":@"john doe"}。在接收方,您从收到的消息中检查 senderID 并使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多