七彩极 发表于 2021-12-7 16:02

Unity 定时发送通知


unity.jpeg

这里用到的插件是Pakeage Manager中的Moblie Notification。


Mobile Notifications.png

建议用推荐版本version1.0.3,下载成功之后,Package包下会自动生成如下图:


20211207094654.jpg

创建一个NotificationSender


控制不同平台下,使用AndroidNotificationSender和iOSNotificationSender。
public class NotificationInfo{    public string title;    public string text;    public int day;    public int hour;    public int minute;    public int second;    public string smallIcon;    public string largeIcon;}public class NotificationSender:#if UNITY_ANDROID    AndroidNotificationSender#else   iOSNotificationSender#endif{    private void OnApplicationFocus(bool hasFocus)    {      if(hasFocus)            ReSendNotification();    }    /// <summary>    /// 得到注册通知的时间    /// </summary>    /// <returns></returns>    public static DateTime GetNotificationTime(NotificationInfo notificationInfo)    {      var daySpan = new TimeSpan(notificationInfo.day,notificationInfo.hour,notificationInfo.minute,notificationInfo.second);      var dateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second) ;      dateTime += daySpan;      if (dateTime.Hour >= 23)      {            dateTime += new TimeSpan(9, 0, 0);      }      if (dateTime.Hour <= 8)      {            dateTime += new TimeSpan(8 - dateTime.Hour, 0, 0);      }      // Debug.Log("LinneaNotify 发出通知时间 : " + dateTime);      return dateTime;    }}
限制了通知时间,不得23点之后和8点之前发出。
Android平台代码:

#ifUNITY_ANDROIDusing System;using System.Collections.Generic;using Unity.Notifications.Android;using UnityEngine;public class AndroidNotificationSender:MonoBehaviour{    private static bool _isInitialized;    private static List<NotificationInfo> _notificationInfos;    private static int _notificationId = 19991;    private static void Init()    {      if(_isInitialized)            return;      _notificationInfos = new List<NotificationInfo>();      ResetNotificationChannel();      var notificationGo= new GameObject("NotificationBehaviour").AddComponent<NotificationSender>();      DontDestroyOnLoad(notificationGo);      _isInitialized = true;    }    private static void ResetNotificationChannel()    {      _notificationId = 19991;      AndroidNotificationCenter.CancelAllNotifications();//清除上次注册的通知      var channel = new AndroidNotificationChannel()      {            Id = "channel_id",            Name = "Default Channel",            Importance = Importance.High,            Description = "Generic notifications",            CanShowBadge = true,            EnableLights=true,            LockScreenVisibility=LockScreenVisibility.Public      };                AndroidNotificationCenter.RegisterNotificationChannel(channel);    }    protected static void ReSendNotification()    {      if (_isInitialized && _notificationInfos != null && _notificationInfos.Count > 0)      {            ResetNotificationChannel();            // for (var i = 0; i < _notificationInfos.Count; i++)            // {            //   SendNotification(_notificationInfos);            // }      }         }      /// <summary>    /// Android 发送通知    /// </summary>    /// <param name="title"></param>    /// <param name="text"></param>    /// <param name="day"></param>    /// <param name="hour"></param>    /// <param name="minute"></param>    /// <param name="second"></param>    /// <param name="smallIconId"></param>    /// <param name="largeIconId"></param>    public static void SendNotification(string title, string text,int day,int hour,int minute,int second ,string smallIconId=null,string largeIconId=null)    {      Init();      var notificationInfo = new NotificationInfo()      {            title = title,            text = text,            day = day,            hour = hour,            minute = minute,            second = second,            smallIcon = smallIconId,            largeIcon = largeIconId      };      _notificationInfos.Add(notificationInfo);      SendNotification(notificationInfo);    }      private static void SendNotification(NotificationInfo notificationInfo)//string title, string text,DateTime time,string smallIconId=null,string largeIconId=null)    {      var time = NotificationSender.GetNotificationTime(notificationInfo);      var notification = new AndroidNotification(){            Title = notificationInfo.title,            Text = notificationInfo.text,            FireTime = time,            SmallIcon = notificationInfo.smallIcon,            LargeIcon = notificationInfo.largeIcon,            Number = _notificationId      };      AndroidNotificationCenter.CancelNotification(_notificationId);      _notificationId++;      AndroidNotificationCenter.SendNotification(notification, "channel_id");    }}#endif
注意ReSendNotification方法,因为我在外部限制通知每次发出先判断上次是否还有通知未发出,所以屏蔽了ReSend方法 。
IOS平台代码:

#ifUNITY_IOSusing System;using System.Collections;using System.Collections.Generic;using UnityEngine;using Unity.Notifications.iOS;public class iOSNotificationSender:MonoBehaviour{   private static bool _isInitialized = false;   private static int _notificationId = 1;   private static List<NotificationInfo> _notificationInfos;    // Start is called before the first frame update    private static void Init()    {      if(_isInitialized)            return;      _notificationInfos = new List<NotificationInfo>();      ResetNotificationChannel();      var notificationGo= new GameObject("NotificationBehaviour").AddComponent<NotificationSender>();      DontDestroyOnLoad(notificationGo);      _isInitialized = true;    }    private static void ResetNotificationChannel()    {      _notificationId = 1;      iOSNotificationCenter.ApplicationBadge=0;      iOSNotificationCenter.RemoveAllDeliveredNotifications();      iOSNotificationCenter.RemoveAllScheduledNotifications();    }    protected static void ReSendNotification()    {      if (_isInitialized&&_notificationInfos!=null && _notificationInfos.Count > 0)      {            ResetNotificationChannel();            // for (var i = 0; i < _notificationInfos.Count; i++)            // {            //   SendNotification(_notificationInfos);            // }      }         }      /// <summary>    /// 发送通知方法    /// </summary>    /// <param name="title"></param>    /// <param name="text"></param>    /// <param name="day"></param>    /// <param name="hour"></param>    /// <param name="minute"></param>    /// <param name="second"></param>    /// <param name="smallIconId"></param>    /// <param name="largeIconId"></param>    public static void SendNotification(string title, string text,int day,int hour,int minute,int second ,string smallIconId=null,string largeIconId=null)    {      Init();               var notificationInfo = new NotificationInfo()      {            title = title,            text=text,            day=day,            hour = hour,            minute = minute,            second = second,            smallIcon = smallIconId,            largeIcon = largeIconId      };      _notificationInfos.Add(notificationInfo);      SendNotification(notificationInfo);    }   private static void SendNotification(NotificationInfo notificationInfo)//string title, string text,TimeSpan timeInterval)    {                var time = NotificationSender.GetNotificationTime(notificationInfo);      var timeInterval = time.Subtract(DateTime.Now);                var timeTrigger = new iOSNotificationTimeIntervalTrigger()      {            TimeInterval = new TimeSpan(timeInterval.Days, timeInterval.Hours, timeInterval.Minutes, timeInterval.Seconds),// timeInterval,            Repeats = false      };                var notification = new iOSNotification()      {            Identifier = "_notification_"+ _notificationId,            Title = notificationInfo.title,            Body = notificationInfo.text,            Badge = _notificationId,            ShowInForeground = true,            ForegroundPresentationOption = (PresentationOption.Alert | PresentationOption.Sound | PresentationOption.Badge),            CategoryIdentifier = "category_a",            ThreadIdentifier = "thread1",            Trigger = timeTrigger,      };      _notificationId++;      iOSNotificationCenter.ScheduleNotification(notification);    }   }#endif
注意_notificationId,这里的id实际上是显示在AppIcon的红点数字

我的调用处理,在程序退出后台后,判断是否达到条件,是否要发出通知:
    /// <summary>    ///isPause    /// </summary>    private static bool isPause;    private static bool isSendNearNotify;    private static bool isSendFarNotify;    private void OnApplicationPause(bool pauseStatus)    {      isPause = pauseStatus;      if (isPause)      {            JudgeNearNotify();            JudgeFarNotify();          }      else      {            isSendNearNotify = false;            isSendFarNotify = false;      }    }
发出一条近期带活通知:
private static void JudgeNearNotify()    {      if (!isPause || isSendNearNotify) return;      isSendNearNotify = true;      var title = LocalizationManager.GetTranslation("notify_title1");      var text = LocalizationManager.GetTranslation("notify_content1");      var time1 = OfflineEquipment.Instance.GetNotifyOfflineTime();      var time2 = CropManager.Instance.GetNotifyCropTime();      var max = time1;      // Debug.Log("LinneaNotify time1 = " + time1 + ", time2 = " + time2);      if (time2 > time1)      {            title = LocalizationManager.GetTranslation("notify_title2");            text = LocalizationManager.GetTranslation("notify_content2");            max = time2;      }      if (max > 0)      {            var day = max / 60 / 60 / 24;            var hour = max / 60 / 60 % 24;            var minute = max / 60 % 60;            var second = max % 60;            // Debug.Log("LinneaNotify day = " + day + ", hour = " + hour + ", minute = " + minute + ", sec = " + second);            NotificationSender.SendNotification(title, text,day, hour, minute, second, "icon_large");         }    }
发出一条远期带活通知:
    /// <summary>    /// 长期不在线拉活    /// </summary>    private static void JudgeFarNotify()    {      if (!isPause || isSendFarNotify) return;      isSendNearNotify = true;      var title = LocalizationManager.GetTranslation("notify_title3");      var text = LocalizationManager.GetTranslation("notify_content3");      NotificationSender.SendNotification(title, text, 3, 0, 0, 0, "icon_large");    }
页: [1]
查看完整版本: Unity 定时发送通知