mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-10-26 21:22:16 +08:00 
			
		
		
		
	fix: Offline push does not have a badge && Android offline push (#3146)
* fix: offline push can display badge * feat: strategy * feat: log * feat: log * chore: offlinepush * fix: offlinepush * fix: log (cherry picked from commit 14393b0f5316aa35d1949bcafd0e73afe0263560)
This commit is contained in:
		
							parent
							
								
									cb4ac19968
								
							
						
					
					
						commit
						5e0200cc91
					
				| @ -16,12 +16,14 @@ package fcm | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options" |  | ||||||
| 	"github.com/openimsdk/tools/utils/httputil" |  | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options" | ||||||
|  | 	"github.com/openimsdk/tools/utils/httputil" | ||||||
|  | 
 | ||||||
| 	firebase "firebase.google.com/go/v4" | 	firebase "firebase.google.com/go/v4" | ||||||
| 	"firebase.google.com/go/v4/messaging" | 	"firebase.google.com/go/v4/messaging" | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | ||||||
| @ -133,7 +135,7 @@ func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string, | |||||||
| 			unreadCountSum, err := f.cache.GetUserBadgeUnreadCountSum(ctx, userID) | 			unreadCountSum, err := f.cache.GetUserBadgeUnreadCountSum(ctx, userID) | ||||||
| 			if err == nil && unreadCountSum != 0 { | 			if err == nil && unreadCountSum != 0 { | ||||||
| 				apns.Payload.Aps.Badge = &unreadCountSum | 				apns.Payload.Aps.Badge = &unreadCountSum | ||||||
| 			} else if err == redis.Nil || unreadCountSum == 0 { | 			} else if errors.Is(err, redis.Nil) || unreadCountSum == 0 { | ||||||
| 				zero := 1 | 				zero := 1 | ||||||
| 				apns.Payload.Aps.Badge = &zero | 				apns.Payload.Aps.Badge = &zero | ||||||
| 			} else { | 			} else { | ||||||
|  | |||||||
| @ -18,6 +18,16 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 
 | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/config" | ||||||
|  | 	"github.com/openimsdk/tools/utils/datautil" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	incOne          = datautil.ToPtr("+1") | ||||||
|  | 	addNum          = "1" | ||||||
|  | 	defaultStrategy = strategy{ | ||||||
|  | 		Default: 1, | ||||||
|  | 	} | ||||||
|  | 	msgCategory = "CATEGORY_MESSAGE" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Resp struct { | type Resp struct { | ||||||
| @ -58,7 +68,24 @@ type TaskResp struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Settings struct { | type Settings struct { | ||||||
| 	TTL *int64 `json:"ttl"` | 	TTL      *int64   `json:"ttl"` | ||||||
|  | 	Strategy strategy `json:"strategy"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type strategy struct { | ||||||
|  | 	Default int64 `json:"default"` | ||||||
|  | 	//IOS     int64 `json:"ios"` | ||||||
|  | 	//St      int64 `json:"st"` | ||||||
|  | 	//Hw      int64 `json:"hw"` | ||||||
|  | 	//Ho      int64 `json:"ho"` | ||||||
|  | 	//XM      int64 `json:"xm"` | ||||||
|  | 	//XMG     int64 `json:"xmg"` | ||||||
|  | 	//VV      int64 `json:"vv"` | ||||||
|  | 	//Op      int64 `json:"op"` | ||||||
|  | 	//OpG     int64 `json:"opg"` | ||||||
|  | 	//MZ      int64 `json:"mz"` | ||||||
|  | 	//HosHw   int64 `json:"hoshw"` | ||||||
|  | 	//WX      int64 `json:"wx"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Audience struct { | type Audience struct { | ||||||
| @ -112,6 +139,8 @@ type Notification struct { | |||||||
| 	ChannelID   string `json:"channelID"` | 	ChannelID   string `json:"channelID"` | ||||||
| 	ChannelName string `json:"ChannelName"` | 	ChannelName string `json:"ChannelName"` | ||||||
| 	ClickType   string `json:"click_type"` | 	ClickType   string `json:"click_type"` | ||||||
|  | 	BadgeAddNum string `json:"badge_add_num"` | ||||||
|  | 	Category    string `json:"category"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Options struct { | type Options struct { | ||||||
| @ -120,6 +149,7 @@ type Options struct { | |||||||
| 		ChannelID    string `json:"/message/android/notification/channel_id"` | 		ChannelID    string `json:"/message/android/notification/channel_id"` | ||||||
| 		Sound        string `json:"/message/android/notification/sound"` | 		Sound        string `json:"/message/android/notification/sound"` | ||||||
| 		Importance   string `json:"/message/android/notification/importance"` | 		Importance   string `json:"/message/android/notification/importance"` | ||||||
|  | 		Category     string `json:"/message/android/category"` | ||||||
| 	} `json:"HW"` | 	} `json:"HW"` | ||||||
| 	XM struct { | 	XM struct { | ||||||
| 		ChannelID string `json:"/extra.channel_id"` | 		ChannelID string `json:"/extra.channel_id"` | ||||||
| @ -140,6 +170,8 @@ func newPushReq(pushConf *config.Push, title, content string) PushReq { | |||||||
| 		ClickType:   "startapp", | 		ClickType:   "startapp", | ||||||
| 		ChannelID:   pushConf.GeTui.ChannelID, | 		ChannelID:   pushConf.GeTui.ChannelID, | ||||||
| 		ChannelName: pushConf.GeTui.ChannelName, | 		ChannelName: pushConf.GeTui.ChannelName, | ||||||
|  | 		BadgeAddNum: addNum, | ||||||
|  | 		Category:    msgCategory, | ||||||
| 	}}} | 	}}} | ||||||
| 	return pushReq | 	return pushReq | ||||||
| } | } | ||||||
| @ -156,6 +188,7 @@ func (pushReq *PushReq) setPushChannel(title string, body string) { | |||||||
| 	notify := "notify" | 	notify := "notify" | ||||||
| 	pushReq.PushChannel.Ios.NotificationType = ¬ify | 	pushReq.PushChannel.Ios.NotificationType = ¬ify | ||||||
| 	pushReq.PushChannel.Ios.Aps.Sound = "default" | 	pushReq.PushChannel.Ios.Aps.Sound = "default" | ||||||
|  | 	pushReq.PushChannel.Ios.AutoBadge = incOne | ||||||
| 	pushReq.PushChannel.Ios.Aps.Alert = Alert{ | 	pushReq.PushChannel.Ios.Aps.Alert = Alert{ | ||||||
| 		Title: title, | 		Title: title, | ||||||
| 		Body:  body, | 		Body:  body, | ||||||
| @ -172,7 +205,8 @@ func (pushReq *PushReq) setPushChannel(title string, body string) { | |||||||
| 			ChannelID    string `json:"/message/android/notification/channel_id"` | 			ChannelID    string `json:"/message/android/notification/channel_id"` | ||||||
| 			Sound        string `json:"/message/android/notification/sound"` | 			Sound        string `json:"/message/android/notification/sound"` | ||||||
| 			Importance   string `json:"/message/android/notification/importance"` | 			Importance   string `json:"/message/android/notification/importance"` | ||||||
| 		}{ChannelID: "RingRing4", Sound: "/raw/ring001", Importance: "NORMAL"}, | 			Category     string `json:"/message/android/category"` | ||||||
|  | 		}{ChannelID: "RingRing4", Sound: "/raw/ring001", Importance: "NORMAL", Category: "IM"}, | ||||||
| 		XM: struct { | 		XM: struct { | ||||||
| 			ChannelID string `json:"/extra.channel_id"` | 			ChannelID string `json:"/extra.channel_id"` | ||||||
| 		}{ChannelID: "high_system"}, | 		}{ChannelID: "high_system"}, | ||||||
|  | |||||||
| @ -18,6 +18,7 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"crypto/sha256" | 	"crypto/sha256" | ||||||
| 	"encoding/hex" | 	"encoding/hex" | ||||||
|  | 	"errors" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| @ -70,7 +71,7 @@ func NewClient(pushConf *config.Push, cache cache.ThirdCache) *Client { | |||||||
| func (g *Client) Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error { | func (g *Client) Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error { | ||||||
| 	token, err := g.cache.GetGetuiToken(ctx) | 	token, err := g.cache.GetGetuiToken(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if errs.Unwrap(err) == redis.Nil { | 		if errors.Is(err, redis.Nil) { | ||||||
| 			log.ZDebug(ctx, "getui token not exist in redis") | 			log.ZDebug(ctx, "getui token not exist in redis") | ||||||
| 			token, err = g.getTokenAndSave2Redis(ctx) | 			token, err = g.getTokenAndSave2Redis(ctx) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| @ -144,7 +145,7 @@ func (g *Client) Auth(ctx context.Context, timeStamp int64) (token string, expir | |||||||
| func (g *Client) GetTaskID(ctx context.Context, token string, pushReq PushReq) (string, error) { | func (g *Client) GetTaskID(ctx context.Context, token string, pushReq PushReq) (string, error) { | ||||||
| 	respTask := TaskResp{} | 	respTask := TaskResp{} | ||||||
| 	ttl := int64(1000 * 60 * 5) | 	ttl := int64(1000 * 60 * 5) | ||||||
| 	pushReq.Settings = &Settings{TTL: &ttl} | 	pushReq.Settings = &Settings{TTL: &ttl, Strategy: defaultStrategy} | ||||||
| 	err := g.request(ctx, taskURL, pushReq, token, &respTask) | 	err := g.request(ctx, taskURL, pushReq, token, &respTask) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", errs.Wrap(err) | 		return "", errs.Wrap(err) | ||||||
| @ -188,6 +189,7 @@ func (g *Client) postReturn( | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | 	log.ZDebug(ctx, "postReturn", "url", url, "header", header, "input", input, "timeout", timeout, "output", output) | ||||||
| 	return output.parseError() | 	return output.parseError() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -204,7 +206,7 @@ func (g *Client) getTokenAndSave2Redis(ctx context.Context) (token string, err e | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g *Client) GetTaskIDAndSave2Redis(ctx context.Context, token string, pushReq PushReq) (taskID string, err error) { | func (g *Client) GetTaskIDAndSave2Redis(ctx context.Context, token string, pushReq PushReq) (taskID string, err error) { | ||||||
| 	pushReq.Settings = &Settings{TTL: &g.taskIDTTL} | 	pushReq.Settings = &Settings{TTL: &g.taskIDTTL, Strategy: defaultStrategy} | ||||||
| 	taskID, err = g.GetTaskID(ctx, token, pushReq) | 	taskID, err = g.GetTaskID(ctx, token, pushReq) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								pkg/common/storage/cache/redis/lua_script.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								pkg/common/storage/cache/redis/lua_script.go
									
									
									
									
										vendored
									
									
								
							| @ -2,7 +2,9 @@ package redis | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 
 | ||||||
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs" | 	"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs" | ||||||
| 	"github.com/openimsdk/tools/errs" | 	"github.com/openimsdk/tools/errs" | ||||||
| 	"github.com/openimsdk/tools/log" | 	"github.com/openimsdk/tools/log" | ||||||
| @ -56,7 +58,7 @@ func callLua(ctx context.Context, rdb redis.Scripter, script *redis.Script, keys | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	v, err := r.Result() | 	v, err := r.Result() | ||||||
| 	if err == redis.Nil { | 	if errors.Is(err, redis.Nil) { | ||||||
| 		err = nil | 		err = nil | ||||||
| 	} | 	} | ||||||
| 	return v, errs.WrapMsg(err, "call lua err", "scriptHash", script.Hash(), "keys", keys, "args", args) | 	return v, errs.WrapMsg(err, "call lua err", "scriptHash", script.Hash(), "keys", keys, "args", args) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user