using UnityEngine; using System; using System.Xml.Serialization; using Firebase.Messaging; using Firebase; using UnityEngine.Android; #if UNITY_ANDROID using Unity.Notifications.Android; #elif UNITY_IOS using Unity.Notifications.iOS; #endif public class NotifyMgr : MonoBehaviour { #if VER_ONESTORE protected const string ChannelId = "jf_onestore"; #elif UNITY_ANDROID protected const string ChannelId = "jf_google"; #else protected const string ChannelId = "jf_apple"; #endif protected const string ChannelName = "Jelly"; protected const string ChannelDesc = "Jelly News"; protected static bool bEndNoti = false; protected static bool bInitChannel = false; static bool notifiOn = true; static bool midNightNotifiOn = true; public static void SetNotifiON(bool bvalue) { notifiOn = bvalue; } public static void SetnightNotifiON(bool bvalue) { midNightNotifiOn = bvalue; } public static void SSendEndNoti() { if (bEndNoti) return; bEndNoti = true; SSendLocalNotification(notifiOn, midNightNotifiOn, true, TimeUtils.NextDayUtc()); } public static void SCancelAllNotification() { bEndNoti = false; #if UNITY_EDITOR #elif UNITY_ANDROID AndroidNotificationCenter.CancelAllNotifications(); #elif UNITY_IOS iOSNotificationCenter.RemoveAllDeliveredNotifications(); iOSNotificationCenter.RemoveAllScheduledNotifications(); #endif } private static DateTime nightStartTime = DateTime.Today.AddHours(15); // 밤 9시 private static DateTime korNightStartTime= nightStartTime.AddHours(9); private static DateTime morningEndTime = DateTime.Today.AddHours(18); // 아침 8시 private static DateTime korMorningEndTime = morningEndTime.AddHours(9); public static void SSendLocalNotification(bool isNotiflyOn, bool isNightNotiflyOn, bool bcancelall, DateTime datetimeutc, string strtitle = null, string strmsg = null) { if (!isNotiflyOn) { return; } if (datetimeutc >= korNightStartTime || datetimeutc <= korMorningEndTime) { if (!isNightNotiflyOn) { return; } } if (bcancelall) SCancelAllNotification(); if (string.IsNullOrEmpty(strtitle)) strtitle = LocalizationText.GetText("msg_localpushtitle001"); if (string.IsNullOrEmpty(strmsg)) strmsg = LocalizationText.GetText("msg_localpushbody001"); #if UNITY_EDITOR #elif UNITY_ANDROID if (!bInitChannel) { bInitChannel = true; AndroidNotificationChannel channel = new AndroidNotificationChannel(ChannelId, ChannelName, ChannelDesc, Importance.Default); AndroidNotificationCenter.RegisterNotificationChannel(channel); } AndroidNotification notification = new AndroidNotification(); notification.Title = strtitle; notification.Text = strmsg; notification.FireTime = datetimeutc.ToLocalTime(); notification.SmallIcon = "icon_0"; notification.LargeIcon = "icon_1"; AndroidNotificationCenter.SendNotification(notification, ChannelId); #elif UNITY_IOS iOSNotification notification = new iOSNotification(); notification.Title = strtitle; notification.Body = strmsg; notification.ShowInForeground = false; notification.CategoryIdentifier = ChannelId; DateTime datetimelocal = datetimeutc.ToLocalTime(); iOSNotificationCalendarTrigger trigger = new iOSNotificationCalendarTrigger() { Year = datetimelocal.Year, Month = datetimelocal.Month, Day = datetimelocal.Day, Hour = datetimelocal.Hour, Minute = datetimelocal.Minute, Second = datetimelocal.Second, Repeats = false }; notification.Trigger = trigger; iOSNotificationCenter.ScheduleNotification(notification); #endif } //https://firebase.google.com/docs/cloud-messaging/unity/client?hl=ko 의 클라우드 메시징 초기화 부분 //https://siyan.tistory.com/9 를 참조. 하기전에 파이어베이스 메세지 패키지도 임포팅함. 구글서비스는 임포팅되어있어서 건너뜀 //https://velog.io/@maratangsoft/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EC%97%90%EC%84%9C-FCM-%EC%84%9C%EB%B2%84-%ED%91%B8%EC%8B%9C-%EB%B0%9B%EA%B8%B0 //https://boxwitch.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%A1%9C%EC%BB%AC%ED%91%B8%EC%8B%9C-Mobile-Notifications //맨 아래쪽은 아이콘, 3번째는 아이콘 기능을 추가하기 위해 찾은 곳. string CHANNEL_ID = "myChannel"; int apiLevel; void Start() { #if UNITY_ANDROID InitializeAndroidLocalPush();//로컬 푸시 알림 초기화 InitializeFCM();//파이어베이스 푸시 알림 초기화 #elif UNITY_IOS #endif } public void InitializeAndroidLocalPush()//로컬푸시 알림 초기화 { #if UNITY_ANDROID string androidInfo = SystemInfo.operatingSystem; Debug.Log("androidInfo: " + androidInfo); apiLevel = int.Parse(androidInfo.Substring(androidInfo.IndexOf("-") + 1, 2)); Debug.Log("apiLevel: " + apiLevel); if (apiLevel >= 33 && !Permission.HasUserAuthorizedPermission("android.permission.POST_NOTIFICATIONS"))//API 에 따라 알림 초기화가 다르게 동작된다. { Permission.RequestUserPermission("android.permission.POST_NOTIFICATIONS"); } if (apiLevel >= 26) { var channel = new AndroidNotificationChannel() { Id = CHANNEL_ID, Name = "test", Importance = Importance.High, Description = "for test", }; AndroidNotificationCenter.RegisterNotificationChannel(channel); } #else //TODO: iOS #endif } public void InitializeFCM()//파이어베이스 메세징 초기화 { FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => { var dependencyStatus = task.Result; if (dependencyStatus == DependencyStatus.Available) { Debug.Log("Google Play version OK"); FirebaseMessaging.TokenReceived += OnTokenReceived; FirebaseMessaging.MessageReceived += OnMessageReceived; //FirebaseMessaging.RequestPermissionAsync().ContinueWithOnMainThread(task => { // Debug.Log("push permission: " + task.Status.ToString()); //}); } else { Debug.LogError(string.Format( "Could not resolve all Firebase dependencies: {0}", dependencyStatus )); } }); } public void OnTokenReceived(object sender, TokenReceivedEventArgs token)//알람을 받았을때 디버그 확인용. 에디터에서는 알람을 받지 못 한다. { Debug.Log("OnTokenReceived: " + token.Token); } public void OnMessageReceived(object sender, MessageReceivedEventArgs e)//알림메세지를 처리하고 안드로이드 푸시를 생성한다. 아이콘의 교체도 여기서 이뤄진다. { #if UNITY_ANDROID //아이콘은 C:\Users\stone110\Documents\zombiestone_test\Zombie\Library\Bee\Android\Prj\IL2CPP\Gradle\unityLibrary\FirebaseApp.androidlib\res 의 drawable 쪽에 있음. string type = ""; string title = ""; string body = ""; // for notification message if (e.Message.Notification != null) { type = "notification"; title = e.Message.Notification.Title; body = e.Message.Notification.Body; } // for data message else if (e.Message.Data.Count > 0) { type = "data"; title = e.Message.Data["title"]; body = e.Message.Data["body"]; } Debug.Log("message type: " + type + ", title: " + title + ", body: " + body); var notification = new AndroidNotification(); notification.SmallIcon = "icon_0"; notification.Title = title; notification.Text = body; notification.FireTime = System.DateTime.Now; notification.SmallIcon = "icon_0"; if (apiLevel >= 26) { AndroidNotificationCenter.SendNotification(notification, CHANNEL_ID); } else { Debug.LogError("Android 8.0 이상의 디바이스에서만 푸시 알림이 정상적으로 표시됩니다."); } #else //TODO: iOS #endif } }