0

我正在使用 FCM 探索 Cloud Functions 以向我的 iOS 应用设备发送推送通知。我有以下结构,我正在倾听注册活动的人。我想提取 eventHost 以便我可以去我的用户节点找到 userUID 并最终找到他的 deviceID,并向他发送推送通知。

{
  "events" : {
    "XXX" : {
      "eventHost" : "YYY", //<-- How do I get this node?
      "eventID" : "XXX",
      "registered" : {  //<-- Listening for this node
        "ASKDJHAIUCHA" : {
          "name" : "Emma Watson",
          "userUID" : "ASKDJHAIUCHA" 
        }
      },
    },

  },

  "users" : {
    "YYY" : {
      "deviceID" : "1234456",
      "name" : "Andrew Garfield",
      "userUID" : "YYY"
    },
  }
}

到目前为止,我的云函数代码:

exports.sendNotification = functions.database.ref('/events/{eventId}/registered')
    .onWrite(event => {
      const register = event.data.val();
      const eventHost = functions.database.ref('/events/' + event.params.eventId + '/eventHost')
      console.log('sendNotifications', eventHost);

      const payload = {
        notification: {
            title: "Event Registration",
            body: "Someone registered to your event!"
        }
      };

      const options = {
        priority: "high"
      };

      return admin.messaging().sendToDevice("theDeviceID", payload, options)

    });

我在向数据库中添加值时的 Swift 部分是这样的:

@IBAction func registerButtonDidTap(_ sender: Any) {

        let personDict = [FIRConstants.UserInfo.Name: user.userName,
                          FIRConstants.UserInfo.UserUID: user.userUID]
        let registerPerson = [user.userUID!: personDict as AnyObject] as [String: AnyObject]
        let values = ["registered": registerPerson]

        FIRHelperClient.sharedInstance.checkIfEventHasRegistrants(ref, event.eventID!) { (has, error) in
            if let error = error {
                print(error.localizedDescription)
            } else {
                if let has = has {
                    if has {
                        self.ref.child("events").child(self.event.eventID!).child("registered").updateChildValues(registerPerson)

                    } else {
                        self.ref.child("events").child(self.event.eventID!).updateChildValues(values)

                    }
                }
            }
        }
    }

我的云功能肯定不完整,因为目前我正在硬编码 theDeviceID。由于我对 Node.js 非常缺乏经验,并且正在尝试用 Swift 编写 iOS 代码和服务器端代码,所以如果这个问题很简单,请原谅我。这里的一些建议会很有帮助,谢谢。

4

1 回答 1

2

您需要阅读主机,而您的代码目前不这样做。

exports.sendNotification = functions.database.ref('/events/{eventId}/registered')
    .onWrite(event => {
      const register = event.data.val();
      const eventHostRef = functions.database.ref('/events/' + event.params.eventId + '/eventHost')
      return eventHostRef.once('value', (eventHostSnapshot) => {
        const eventHost = eventHostSnapshot.val();
        console.log('sendNotifications', eventHost);

        const payload = {
          notification: {
            title: "Event Registration",
            body: "Someone registered to your event!"
          }
        };

        const options = {
          priority: "high"
        };

        return admin.messaging().sendToDevice("theDeviceID", payload, options)
      });
    });

我强烈建议您在继续之前花一些时间学习如何通过 JavaScript 与 Firebase 数据库进行交互。这不一定要通过 Cloud Functions。您还可以在客户端上使用来自 Node.js的 Firebase Database Admin SDK或使用Firebase codelab for web。无论您采用哪种方式,都将确保您为通过 Cloud Functions 与数据库交互做好充分准备。

作为最后的警告:您将多个数据类型嵌套在一个列表下。不建议这样做,因为它会导致各种问题。相反,我会将注册用户拉到他们自己的顶级节点中,以便您获得:

{
  "events" : {
    "XXX" : {
      "eventHost" : "YYY",
      "eventID" : "XXX"
    }
  },
  "registered" : {
    "XXX" : {
      "ASKDJHAIUCHA" : {
        "name" : "Emma Watson",
        "userUID" : "ASKDJHAIUCHA" 
      }
    }
  },
  "users" : {
    "YYY" : {
      "deviceID" : "1234456",
      "name" : "Andrew Garfield",
      "userUID" : "YYY"
    }
  }
}
于 2017-03-18T15:08:02.760 回答