golang实现Firebase云消息推送功能插件库fcm的使用

golang实现Firebase云消息推送功能插件库fcm的使用

Firebase Cloud Notifications Client

Firebase Cloud Messaging 是为应用程序服务器实现的Go语言库,设计用于通过HTTP API发送简单的推送通知。

开始使用

要安装fcm,使用go get命令:

go get gopkg.in/maddevsio/fcm.v1

导入fcm:

import "gopkg.in/maddevsio/fcm.v1"

示例用法

package main

import (
	"fmt"
	"log"

	"gopkg.in/maddevsio/fcm.v1"
)

func main() {
	// 创建要发送的数据
	data := map[string]string{
		"msg": "Hello World1",
		"sum": "Happy Day",
	}
	
	// 使用服务器密钥初始化FCM客户端
	c := fcm.NewFCM("serverKey")
	
	// 设备注册token
	token := "token"
	
	// 发送消息
	response, err := c.Send(fcm.Message{
		Data:             data,  // 自定义数据
		RegistrationIDs:  []string{token},  // 目标设备token
		ContentAvailable: true,  // iOS后台刷新
		Priority:         fcm.PriorityHigh,  // 消息优先级
		Notification: fcm.Notification{  // 通知内容
			Title: "Hello",
			Body:  "World",
		},
	})
	
	if err != nil {
		log.Fatal(err)
	}
	
	// 打印响应结果
	fmt.Println("Status Code   :", response.StatusCode)
	fmt.Println("Success       :", response.Success)
	fmt.Println("Fail          :", response.Fail)
	fmt.Println("Canonical_ids :", response.CanonicalIDs)
	fmt.Println("Topic MsgId   :", response.MsgID)
}

更多示例可以在/_examples/目录中找到

许可证

MIT License

Copyright © 2017 Mad Devs Developers

特此授予任何人免费获得本软件和相关文档文件的副本(“软件”),以处理本软件而不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人员这样做,但须符合以下条件:

上述版权声明和本许可声明应包含在本软件的所有副本或实质性部分中。

本软件按"原样"提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为还是其他方面,由软件或软件的使用或其他交易引起、由软件引起或与之相关。


更多关于golang实现Firebase云消息推送功能插件库fcm的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Firebase云消息推送功能插件库fcm的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Golang实现Firebase云消息推送(FCM)

Firebase Cloud Messaging (FCM) 是Google提供的跨平台消息推送服务。下面我将介绍如何在Golang中使用FCM实现消息推送功能。

准备工作

  1. 在Firebase控制台创建项目并获取服务器密钥
  2. 获取目标设备的FCM注册令牌(registration token)

安装必要的库

推荐使用官方Firebase Admin SDK的Golang版本:

go get firebase.google.com/go/v4

基本实现代码

package main

import (
	"context"
	"log"

	firebase "firebase.google.com/go/v4"
	"firebase.google.com/go/v4/messaging"
	"google.golang.org/api/option"
)

func main() {
	// 初始化Firebase应用
	ctx := context.Background()
	
	// 使用服务账号JSON文件初始化
	opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
	app, err := firebase.NewApp(ctx, nil, opt)
	if err != nil {
		log.Fatalf("error initializing app: %v\n", err)
	}

	// 获取FCM客户端
	client, err := app.Messaging(ctx)
	if err != nil {
		log.Fatalf("error getting Messaging client: %v\n", err)
	}

	// 这是目标设备的注册令牌
	registrationToken := "YOUR_REGISTRATION_TOKEN"

	// 构建消息
	message := &messaging.Message{
		Notification: &messaging.Notification{
			Title: "标题",
			Body:  "消息内容",
		},
		Token: registrationToken,
	}

	// 发送消息
	response, err := client.Send(ctx, message)
	if err != nil {
		log.Fatalf("error sending message: %v\n", err)
	}

	log.Printf("Successfully sent message: %v\n", response)
}

高级功能实现

1. 发送给多个设备

// 发送给多个设备
tokens := []string{"token1", "token2", "token3"}
multicastMessage := &messaging.MulticastMessage{
	Notification: &messaging.Notification{
		Title: "多设备标题",
		Body:  "多设备消息内容",
	},
	Tokens: tokens,
}

br, err := client.SendMulticast(ctx, multicastMessage)
if err != nil {
	log.Fatalf("error sending multicast message: %v\n", err)
}

log.Printf("%d messages were sent successfully\n", br.SuccessCount)

2. 发送带数据的消息

// 发送带数据的消息
dataMessage := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Token: registrationToken,
}

_, err = client.Send(ctx, dataMessage)
if err != nil {
	log.Fatalf("error sending data message: %v\n", err)
}

3. 发送给主题订阅者

// 发送给主题
topicMessage := &messaging.Message{
	Notification: &messaging.Notification{
		Title: "主题消息标题",
		Body:  "主题消息内容",
	},
	Topic: "news",
}

_, err = client.Send(ctx, topicMessage)
if err != nil {
	log.Fatalf("error sending topic message: %v\n", err)
}

4. 条件消息发送

// 条件消息发送
conditionMessage := &messaging.Message{
	Notification: &messaging.Notification{
		Title: "条件消息标题",
		Body:  "条件消息内容",
	},
	Condition: "'stock-GOOG' in topics || 'industry-tech' in topics",
}

_, err = client.Send(ctx, conditionMessage)
if err != nil {
	log.Fatalf("error sending condition message: %v\n", err)
}

错误处理

FCM可能会返回各种错误,需要适当处理:

response, err := client.Send(ctx, message)
if err != nil {
	if messaging.IsRegistrationTokenNotRegistered(err) {
		// 处理无效的注册令牌
		log.Println("Registration token is no longer valid")
	} else {
		log.Fatalf("error sending message: %v\n", err)
	}
}

最佳实践

  1. 将FCM客户端初始化代码封装为单例
  2. 实现消息队列机制处理大量推送
  3. 记录推送结果用于分析和排查问题
  4. 定期清理无效的注册令牌

完整封装示例

package fcm

import (
	"context"
	"log"
	"sync"

	firebase "firebase.google.com/go/v4"
	"firebase.google.com/go/v4/messaging"
	"google.golang.org/api/option"
)

type FCMClient struct {
	client *messaging.Client
}

var (
	instance *FCMClient
	once     sync.Once
)

func GetInstance(credentialFile string) (*FCMClient, error) {
	var initErr error
	once.Do(func() {
		ctx := context.Background()
		opt := option.WithCredentialsFile(credentialFile)
		
		app, err := firebase.NewApp(ctx, nil, opt)
		if err != nil {
			initErr = err
			return
		}

		client, err := app.Messaging(ctx)
		if err != nil {
			initErr = err
			return
		}

		instance = &FCMClient{client: client}
	})

	return instance, initErr
}

func (f *FCMClient) SendToToken(token string, title, body string, data map[string]string) (string, error) {
	message := &messaging.Message{
		Notification: &messaging.Notification{
			Title: title,
			Body:  body,
		},
		Token: token,
		Data:  data,
	}

	return f.client.Send(context.Background(), message)
}

// 其他方法实现...

使用这个封装:

client, err := fcm.GetInstance("path/to/serviceAccountKey.json")
if err != nil {
	log.Fatal(err)
}

response, err := client.SendToToken("device_token", "标题", "内容", nil)
if err != nil {
	log.Println("发送失败:", err)
} else {
	log.Println("发送成功:", response)
}

以上代码提供了在Golang中使用FCM的基本实现和高级功能。根据实际需求,你可以进一步扩展和优化这些代码。

回到顶部