com.guru.unity.sdk.core/Runtime/GuruNoification/Manager/NotificationAgentIOS.cs

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