我正在考虑在数据库中保留所有注册ID(推送令牌)并从iPhone发送通知给用户。我试过这样的事情,但没有得到任何通知。
func sendPNMessage() {
FIRMessaging.messaging().sendMessage(
["body": "hey"],
to: TOKEN_ID,
withMessageID: "1",
timeToLive: 108)
}
我做错了什么或者根本不可能?
答案 0 :(得分:19)
目前无法从应用程序本身发送消息。 您可以使用服务器端API从Firebase Web控制台或自定义服务器发送消息。
您可能想要做的是联系服务器(例如通过http调用),该服务器会将消息发送给用户。 这样可以确保服务器的API-KEY受到保护。
PS:sendMessage(..)
api被称为上游功能,如果您的服务器与FCM服务器有XMPP连接,则可用于将消息从您的应用程序发送到您的服务器。
答案 1 :(得分:7)
是的,您可以通过Firebase发送推送通知。请确保不要将服务器密钥包含在您的客户端中。有些方法“不是那么好的人”找到它并做些事情......正确的方法是让你的客户指示你的app-server发送通知。
您必须向Google-API-Endpoint发送HTTP-Post。
您需要以下标题:
Content-Type: application/json
Authorization: key={your_server_key}
You can obtain your server key within in the Firebase-Project.
HTTP-Post-Content: Sample
{
"notification": {
"title": "Notification Title",
"text": "The Text of the notification."
},
"project_id": "<your firebase-project-id",
"to":"the specific client-device-id"
}
答案 2 :(得分:3)
Google Cloud Functions现在可以在没有应用服务器的情况下从设备到设备发送推送通知。
From the Google Cloud Functions documentation:
开发人员可以使用云功能来保持用户的参与度 日期与应用程序的相关信息。例如,考虑一下 允许用户在应用中关注彼此活动的应用。 在这样的应用程序中,由实时数据库触发的函数写入 商店新粉丝可以创建Firebase云消息传递(FCM) 通知让相关用户知道他们已经获得了 新粉丝。
示例:
该函数会在写入存储关注者的实时数据库路径时触发。
该功能组成要通过FCM发送的消息。
- 醇>
FCM将通知消息发送给用户的设备。
Here is a demo project用于使用Firebase和Google Cloud Functions发送设备到设备推送通知。
答案 3 :(得分:1)
Diego的答案非常准确,但是firebase也提供了云功能,在数据库的每次更改中发送通知都很方便。例如,假设您正在构建聊天应用程序,并在每个新的关注者更改中发送通知。 This function sample是一个很好的例子。
有关云功能的更多信息,您可以检查official docs。
答案 4 :(得分:0)
我有一个包含“向开发者发送反馈”部分的应用。我的 Firestore 数据库中还有一个 User 集合。当用户登录应用程序时,我让用户数据在我的 SceneDelegate.swift 中使用以下代码更新他们的 FCM 令牌:
import Firebase
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
authListener = Auth.auth().addStateDidChangeListener({ (auth, user) in
Auth.auth().removeStateDidChangeListener(self.authListener!)
if user != nil {
DispatchQueue.main.async {
let docRef = Firestore.firestore().collection("User").document((user?.email)!)
docRef.getDocument { (snapshot, error) in
guard let snapshot = snapshot else {return}
Messaging.messaging().token { token, error in
if let error = error {
print("Error fetching FCM registration token: \(error)")
} else if let token = token {
docRef.updateData(["FCMtoken":token])
print("FCM registration token: \(token)")
}
}
}
}
}
})
guard let _ = (scene as? UIWindowScene) else { return }
}
然后在我的反馈视图控制器中,我有这个代码来发送我的特定设备(但你可以在你的数据库中查找/获取你想要的特定设备,其中 FCMtoken 存储在我有 INSERT-DEVICE-TOKEN-HERE 的位置) .要发送到的 url 是“https://fcm.googleapis.com/fcm/send”,您可以通过转到 firebase 中的项目设置、转到云消息传递选项卡及其服务器来找到 YOUR-APP-FCM-KEY键。
func sendMePushNotification() {
let token = "INSERT-DEVICE-TOKEN-HERE"
if let url = URL(string: "https://fcm.googleapis.com/fcm/send") {
var request = URLRequest(url: url)
request.allHTTPHeaderFields = ["Content-Type":"application/json", "Authorization":"key=YOUR-APP-FCM-KEY"]
request.httpMethod = "POST"
request.httpBody = "{\"to\":\"\(token)\",\"notification\":{\"title\":\"Feedback Sent!\",\"body\":\"\(self.feedbackBox.text!)\",\"sound\":\"default\",\"badge\":\"1\"},\"data\": {\"customDataKey\": \"customDataValue\"}}".data(using: .utf8)
URLSession.shared.dataTask(with: request) { (data, urlresponse, error) in
if error != nil {
print("error")
} else {
print("Successfully sent!.....")
}
}.resume()
}
}
答案 5 :(得分:-1)
使用信号,你可以将设备发送到通知或设备到段,它可以用这种方式与firebase一起工作 使用信号函数创建一个特定的id,将其保存在firebase数据库中,然后将id放入另一个用于发送通知的函数中 注意:1 - 我在我的应用程序中使用它与firebase完美配合 2-i可以提交该代码,只是有人评论,所以我可以找到这个答案