151 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| 
 | |
| namespace Guru.Notification
 | |
| {
 | |
|     using System;
 | |
|     using UnityEngine;
 | |
| #if UNITY_IOS
 | |
|     using System.Threading.Tasks;
 | |
|     using Unity.Notifications.iOS;
 | |
| #endif
 | |
| 
 | |
|     public class NotificationAgentIOS : INotificationAgent
 | |
|     {
 | |
| 
 | |
|         private const string STATUS_GRANTED = "granted";
 | |
|         private const string STATUS_DENIDED = "denied";
 | |
|         private const string STATUS_PROVISIONAL = "provisional";
 | |
|         private const string STATUS_NOT_DETERMINED = "not_determined";
 | |
| 
 | |
|         private static bool _initOnce;
 | |
|         private static int _waitSeconds = 30;
 | |
|         private string SavedNotiPermStatus
 | |
|         {
 | |
|             get => PlayerPrefs.GetString(nameof(SavedNotiPermStatus), "");
 | |
|             set => PlayerPrefs.SetString(nameof(SavedNotiPermStatus), value);
 | |
|         }
 | |
|         
 | |
| 
 | |
|         private string _notiStatus;
 | |
|         
 | |
|         public void Init()
 | |
|         {
 | |
|             if (_initOnce) return;
 | |
|             _initOnce = true;
 | |
| 
 | |
|             _notiStatus = SavedNotiPermStatus;
 | |
|             if (string.IsNullOrEmpty(_notiStatus))
 | |
|                 _notiStatus = STATUS_NOT_DETERMINED;
 | |
|             
 | |
| #if UNITY_IOS
 | |
|             InitPlugins();
 | |
| #endif
 | |
|         }
 | |
| 
 | |
|         public string GetStatus()
 | |
|         {
 | |
|             if (!_initOnce) Init();
 | |
| #if UNITY_IOS
 | |
|             UpdateStatus();
 | |
| #endif
 | |
|             return _notiStatus;
 | |
|         }
 | |
| 
 | |
|         public bool IsAllowed()
 | |
|         {
 | |
|             return _notiStatus == STATUS_GRANTED;
 | |
|         }
 | |
| 
 | |
|         public void RequestPermission(Action<string> callback = null)
 | |
|         {
 | |
|             if (!_initOnce) Init();
 | |
| 
 | |
|             if (_notiStatus == STATUS_GRANTED || _notiStatus == STATUS_DENIDED)
 | |
|             {
 | |
|                 Debug.Log($"[SDK][Noti][iOS] --- Already has Status: {_notiStatus}");
 | |
|                 callback?.Invoke(_notiStatus); // 已获得授权, 直接返回结果
 | |
|                 return;
 | |
|             }
 | |
|             
 | |
| #if UNITY_IOS
 | |
|             RequestIOSPermission(callback);
 | |
| #endif
 | |
|         }
 | |
| 
 | |
| 
 | |
| #if UNITY_IOS
 | |
| 
 | |
|         private void InitPlugins()
 | |
|         {
 | |
|             UpdateStatus();
 | |
|         }
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 更新状态
 | |
|         /// </summary>
 | |
|         private void UpdateStatus()
 | |
|         {
 | |
|             string status = STATUS_NOT_DETERMINED;
 | |
|             var authorizationStatus = iOSNotificationCenter.GetNotificationSettings().AuthorizationStatus;
 | |
|             switch (authorizationStatus)
 | |
|             {
 | |
|                 case AuthorizationStatus.Authorized:
 | |
|                     status = STATUS_GRANTED;
 | |
|                     break;
 | |
|                 case AuthorizationStatus.Denied:
 | |
|                     status = STATUS_DENIDED;
 | |
|                     break;
 | |
|                 case AuthorizationStatus.NotDetermined:
 | |
|                     status = STATUS_NOT_DETERMINED;
 | |
|                     break;
 | |
|                 case AuthorizationStatus.Provisional:
 | |
|                     status = STATUS_PROVISIONAL;
 | |
|                     break;
 | |
|                 default:
 | |
|                     Debug.Log($"[SDK][Noti][iOS] --- Unmarked AuthorizationStatus: {status}");
 | |
|                     break;
 | |
|             }
 | |
| 
 | |
|             SetGrantStatus(status);
 | |
|         }
 | |
| 
 | |
|         private void SetGrantStatus(string status)
 | |
|         {
 | |
|             _notiStatus = status;
 | |
|             SavedNotiPermStatus = status;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 请求 IOS 的推送
 | |
|         /// </summary>
 | |
|         /// <param name="callback"></param>
 | |
|         private async void RequestIOSPermission(Action<string> callback = null)
 | |
|         {
 | |
|             Debug.Log($"[SDK][Noti][iOS] --- RequestIOSPermission start");
 | |
|             int timePassed = 0;
 | |
|             using (var req = new AuthorizationRequest(AuthorizationOption.Alert | AuthorizationOption.Badge, true))
 | |
|             {
 | |
|                 while (!req.IsFinished && timePassed < _waitSeconds)
 | |
|                 {
 | |
|                     timePassed++;
 | |
|                     await Task.Delay(1000);
 | |
|                 };
 | |
| 
 | |
|                 if (timePassed >= _waitSeconds)
 | |
|                 {
 | |
|                     Debug.LogWarning($"[SDK][Noti][iOS] --- RequestIOSPermission timeout");
 | |
|                 }
 | |
| 
 | |
|                 UpdateStatus();
 | |
|                 callback?.Invoke(_notiStatus);
 | |
|                 Debug.Log($"[SDK][Noti][iOS] --- User Selected: {_notiStatus}");
 | |
|             }
 | |
|         }
 | |
|         
 | |
| #endif
 | |
|         
 | |
|         
 | |
|         
 | |
|         
 | |
|     }
 | |
| } |