0

我正在使用FCM探索雲功能,以便對我的iOS應用設備執行推送通知。我有以下結構,我正在收聽註冊參加活動的人。我想提取eventHost,以便我可以去我的用戶節點查找userUID並最終找到他的deviceID,並向他發送推送通知。Firebase CloudFunctions:查詢節點

{ 
    "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) 

    }); 

我的雨燕部分時增加值到數據庫是這樣的:

@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) 

        } 
       } 
      } 
     } 
    } 

我的雲功能是肯定不完整,因爲目前我硬編碼設備ID。由於我對Node.js非常不熟悉,並且試圖在Swift和服務器端代碼中寫入iOS代碼,所以如果這個問題是基本的,請原諒我。這裏的一些建議將是有益的,謝謝。

回答

1

您需要閱讀代碼目前無法執行的主機。

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數據庫交互。這不一定要通過雲功能。您也可以在客戶端的Node.js中使用use the Firebase Database Admin SDK或採取the Firebase codelab for web。無論您採取哪種方式,都可以確保您準備好通過雲功能與數據庫進行交互。

作爲最終警告:您將多個數據類型嵌套在單個列表下。這是不推薦的,因爲它會導致各種各樣的問題。相反,我會將註冊用戶拉到自己的頂級節點,以便您獲得:

{ 
    "events" : { 
    "XXX" : { 
     "eventHost" : "YYY", 
     "eventID" : "XXX" 
    } 
    }, 
    "registered" : { 
    "XXX" : { 
     "ASKDJHAIUCHA" : { 
     "name" : "Emma Watson", 
     "userUID" : "ASKDJHAIUCHA" 
     } 
    } 
    }, 
    "users" : { 
    "YYY" : { 
     "deviceID" : "1234456", 
     "name" : "Andrew Garfield", 
     "userUID" : "YYY" 
    } 
    } 
} 
+0

您好,非常感謝您的建議,我花了一些時間閱讀codelab並設法部署一些使用雲功能的非常基本的推送通知代碼。我也注意到你對數據嵌套的建議。 – Koh

+0

很高興聽到Koh。請注意,您發佈的代碼和JSON與我的答案中的代碼和JSON類似。這是一個普遍的禮貌*不(作爲你自己的答案張貼相同的基本解決方案。 –

+0

嗨,坦率地說,我很抱歉,我已經拿下了我的答案,並認出了你的答案。 – Koh