如何使用Firebase向特定用户发送信息

时间:2017-01-21 01:35:26

标签: swift firebase firebase-realtime-database

您好!首先,我将解释游戏的作用,然后解释我的问题:

所以我正在创建一个应用程序,让玩家可以互相玩小游戏。 首先,它们会显示一个表格视图,其中显示了它们的名称。每个名字都是一个创造了游戏室的玩家。

然后玩家选择要玩的游戏室(仅允许2个人)然后游戏将开始。游戏使用一个名为“阶段”的变量。这是我用于在Firebase数据库中存储数据的参考(下面的代码)。我稍后在应用程序中调用以获得当前游戏的“阶段”。

但是,当我更改引用的值时,它会为应用中的每个人更改它。所以无论你与谁对抗,如果一个人改变了价值,那么每个人都会受到影响。那么,我该如何解决这个问题?

这是我将数据存储到Firebase数据库的方式:

我首先创建引用以存储数据。

private lazy var currentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("currentPhase")
private lazy var whoWonCurrentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("whoWonCurrentPhase")

然后,为了获得当前阶段,我观察它:

private func observerCurrentPhase(){

    currentPhase = currentPhaseRef.observe(.childAdded, with: { (snapshot) -> Void in

        let phaseData = snapshot.value as! UInt

        self.currentPhase = phaseData

    })
}

我理解为什么这不起作用。它没有用,因为我正在设置每个人都可以使用的值。

那么,我如何为每个用户提供不同的引用(例如:Player 1的Did是123456,所以引用将是'123456CurrentPhase')?这样,当他们玩游戏时,它会从个性化的参考名称中提取数据。但是我如何与任何一个用户进行通信,以便他们使用相同的参考?

另一种询问方式是如何将其设置为两个用户都可以使用 ONE 个性化代码从中提取数据的位置。

注意:选择单元格来玩游戏的玩家和实际启动游戏的玩家是两个不同的ViewControllers / Code文件。所以我并不担心将一个控制器格式化为两端都可以工作。 IE浏览器。当您创建游戏并选择游戏时,他们会将您发送给两个不同的控制器。

感谢您提供反馈,如果您需要任何进一步的详细信息或有任何疑问,请与我们联系。 :)

1 个答案:

答案 0 :(得分:1)

您需要将游戏分开,您可以让数据库看起来像这样。

{
  games : {
    fbgeneratedId1 : {
      host: userid1,
      client: userid2
      matched: true,
      gameid : fbgeneratedId1,
      WhoWonCurrentPhase: "Bob"
    },
    //case when a client joins the game
    fbgeneratediId2 : {
      host: userid1,
      matched: false,
      gameid:fbgeneratedId2
    }
    //a newly created game with only the host
  }
}

所以游戏将是你的游戏列表。当主持人创建游戏时,游戏将被插入到列表中,如下所示:

var newGameRef =  FIRDatabase.database().reference().child("games").push();
var myGameId = newGameRef.key
//create a new game and store it's ID inside so its easy to access for updates
newGameRef.set({
    host: userid1,
    matched: false,
    gameid: myGameId
});

当主持人创建游戏时,他们必须知道游戏的关键,当客户端加入时,他们也应该知道密钥,以便他们只能将游戏对象单独操作到他们的游戏中。所以你的阶段参考成为:

private lazy var whoWonCurrentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("games/"+myGameId+"/whoWonCurrentPhase")

您可以将该游戏标记为匹配,以便可以根据需要从游戏列表中过滤掉。注意:myGameId将是其中一个fbgeneratedIds