陈巧倩

Unity 本地推送 安卓篇

· 280 words · 2 minutes to read
Categories: Unity
Tags: Notifications

Unity Mobile Notifications 在Android和IOS平台上进行本地推送通知支持一次性和可重复的通知。安卓篇

Mobile Notifications 🔗

要求 🔗

兼容 Unity 2019.4 或以上版本。 兼容 Android 4.4+ (API 19) 和 iOS 10.0+。

支持的功能 🔗

发布本地一次性或可重复的通知。 取消已经显示和即将到来的(预定的)通知。

安装 🔗

在Unity中打开PackageManager(Window > Package Manager),找到Mobile Notifications,然后Install。

安卓 🔗

权限 🔗

android.permission.SCHEDULE_EXACT_ALARM (Android 12.0起精确时间调度) android.permission.USE_EXACT_ALARM (Android 13.0起精确时间调度) 从Android13.0开始,需要征得用户许可才能显示通知。当应用程序API小于33时,操作系统会在应用程序启动时自动请求权限。当API33或更高版本为目标时,请求权限取决于应用程序本身,否则通知将不会显示在托盘中。

if (!Permission.HasUserAuthorizedPermission("android.permission.POST_NOTIFICATIONS"))
{
    Permission.RequestUserPermission("android.permission.POST_NOTIFICATIONS");
}

关键类 🔗

AndroidNotificationChannel对通知分配一个频道,可以设置设备收到通知后设备的表现,例如:是否闪光、是否开启震动、锁定屏幕显示位置、通知样式等等。

var channel = new AndroidNotificationChannel()
{
    Id = "Local_Notice",
    Name = "Local Channel",
    Importance = Importance.Default,
    Description = "Local Notifications",
};
AndroidNotificationCenter.RegisterNotificationChannel(channel);

AndroidNotificationCenter执行发送、更新和删除通知等操作。

  1. 发送通知

    /**
    **发送通知,同时返回通知Id,对该通知进行追踪。
    */
    public static int SendNotification(AndroidNotification notification, string channelId)
    
  2. 删除通知

    /**
    **取消所有之前显示的通知。该应用程序显示的所有通知将从状态栏中删除。所有预定的通知仍将按预定时间显示。
    */
    public static void CancelAllDisplayedNotifications()
    
    /**
    **取消应用程序安排或之前显示的所有通知。所有预定的通知将被取消。该应用程序显示的所有通知将从状态栏中删除。
    */
    public static void CancelAllNotifications()
    
    /**
    **取消应用程序安排的所有通知。所有预定的通知将被取消。如果通知已经显示,它们将不会从状态栏中删除。
    */
    public static void CancelAllScheduledNotifications()
    
    /**
    **取消之前显示的通知。通知将从状态栏中删除。
    */
    public static void CancelDisplayedNotification(int id)
    
    /**
    **取消预定的或之前显示的通知。通知将不再在预定时间显示。如果它已经交付,它将从状态栏中删除。
    */
    public static void CancelNotification(int id)
    
    /**
    **取消预定的通知。通知将不再在预定时间显示。如果它已经交付,它不会从状态栏中删除。
    */
    public static void CancelScheduledNotification(int id)
    
  3. 消息频道注册

    /**
    **将创建的消息通道注册到消息中心。
    */
    public static void RegisterNotificationChannel(AndroidNotificationChannel channel)
    

    频道重要性级别 对于您定义的每个频道,您将为其分配一个重要性级别,用来控制每个通道的行为(取代优先级)。 重要性级别具有以下限制: 您分配的重要性级别将是频道的默认值。用户可以在 Android 设置中更改频道的重要性级别。一旦你选择了一个重要性级别,你就可以限制你如何改变它:你只能降低重要性,并且只有在用户没有明确改变它的情况下。 频道重要性的选择应考虑到用户的时间和注意力。当一个不重要的通知被伪装成紧急通知时,它会产生不必要的警报。

    重要性 行为 用法 例子
    高的 发出 声音并 出现在 屏幕上 用户 必须立即了解或采取行动的时间关键信息 短信、闹钟、 电话
    默认 发出 声音 应该在用户方便的时候尽早看到的信息 ,但不会 打断他们正在做的事情 路况提醒、任务 提醒
    低的 没有声音 不满足 其他重要性级别要求的通知渠道 用户 订阅的新内容、 社交网络 邀请
    最小值 没有声音或 视觉 干扰 可以等待或与用户不特别相关的非必要信息 附近名胜 、天气、 宣传内容
  4. 检测打开应用的通知

    /**
    **允许检索用于打开应用程序的通知。当返回值!=Null时,意味着通过点击该通知打开的应用程序
    */
    public static AndroidNotificationIntentData GetLastNotificationIntent()
    
  5. 收到事件

    /**
    **收到通知事件。
    */
    public static event AndroidNotificationCenter.NotificationReceivedCallback OnNotificationReceived
    
  6. 其他关键类型,AndroidNotification用于安排本地通知,其中包括通知的内容等等。

    /**
    **创建一个通知,title通知标题,text通知内容,fireTime显示时间(DateTime.Now 立即显示)
    */
    public AndroidNotification(string title, string text, DateTime fireTime)
    /**
    **创建一个可重复的通知结构,title通知标题,text通知内容,fireTime显示时间(DateTime.Now 立即显示),repeatInterval重复间隔
    */
    public AndroidNotification(string title, string text, DateTime fireTime, TimeSpan repeatInterval)
    /**
    **存储数据字段,发送通知的时候设置了改值,则收到通知后同样可以取到该值,用于收发通知的数据传递
    */
    public string IntentData { readonly get; set; }
    public string LargeIcon { readonly get; set; }
    public string SmallIcon { readonly get; set; }
    

​ 通知Icon设置在Unity中的设置:Editor->Project Settings->Mobile Notigficationd,Small小图标、Large大图标。

通知展示 🔗

  1. SmallIcon小图标
  2. 应用名称(系统提供)
  3. 收到时间(系统提供)
  4. LargeIcon大图标
  5. 通知标题
  6. 通知内容

常见问题 🔗

  1. 为什么 Android 小图标在编辑器通知设置预览中是白色的? 因为小通知图标是单色的,Android 会忽略图标图像中的所有非 alpha 通道,Unity 会自动去除所有 RGB 通道。 解决方法:将它们放在\Assets\Plugins\Android\res\drawable-{scaleFactor}不会自动处理的文件夹中。但是,包含非 alpha 通道的图标将无法在 Android 5.0 及更高版本上正确显示。
  2. 为什么当我的应用程序关闭且不在后台运行时,某些华为和小米手机上没有发送通知? 华为(包括荣耀)和小米似乎使用了激进的节电技术来限制应用程序后台活动,除非该应用程序已被用户在设备设置中列入白名单。这意味着如果应用程序关闭或未在后台运行,则不会发送预定的通知。目前,除了鼓励用户将您的应用列入白名单外,没有可用的解决方法。

结论 🔗

搬砖愉快!