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
 | 
						|
        
 | 
						|
        
 | 
						|
        
 | 
						|
        
 | 
						|
    }
 | 
						|
} |