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 _notiStatus; public void Init() { if (_initOnce) return; _initOnce = true; _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() { var status = iOSNotificationCenter.GetNotificationSettings().AuthorizationStatus; switch (status) { case AuthorizationStatus.Authorized: _notiStatus = STATUS_GRANTED; break; case AuthorizationStatus.Denied: _notiStatus = STATUS_DENIDED; break; case AuthorizationStatus.NotDetermined: _notiStatus = STATUS_NOT_DETERMINED; break; case AuthorizationStatus.Provisional: _notiStatus = STATUS_PROVISIONAL; break; default: Debug.Log($"[SDK][Noti][iOS] --- Unmarked AuthorizationStatus: {status}"); break; } } /// /// 请求 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 } }