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 callback = null) { if (!_initOnce) Init(); #if UNITY_IOS RequestIOSPermission(callback); #endif } #if UNITY_IOS private void InitPlugins() { UpdateStatus(); } /// /// 更新状态 /// 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; } /// /// 请求 IOS 的推送 /// /// private async void RequestIOSPermission(Action 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 } }