增加sdk

This commit is contained in:
2026-07-14 10:20:45 +08:00
parent 20d09e4ebb
commit 57709d109d
1165 changed files with 59941 additions and 4485 deletions
@@ -0,0 +1,263 @@
using System;
using System.Collections;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using Unity.Notifications;
class UnifiedNotificationsSendingTests
{
[OneTimeSetUp]
public void BeforeTests()
{
var args = NotificationCenterArgs.Default;
args.AndroidChannelId = "Unified";
args.AndroidChannelName = "Unified";
args.AndroidChannelDescription = "Unified notifications";
NotificationCenter.Initialize(args);
NotificationCenter.OnNotificationReceived += OnNotificationReceived;
}
[OneTimeTearDown]
public void AfterAllTests()
{
NotificationCenter.CancelAllScheduledNotifications();
}
[SetUp]
public void BeforeEachTest()
{
NotificationCenter.CancelAllScheduledNotifications();
receivedNotificationCount = 0;
lastNotification = null;
}
uint receivedNotificationCount = 0;
Notification? lastNotification;
void OnNotificationReceived(Notification notification)
{
++receivedNotificationCount;
lastNotification = notification;
}
IEnumerator WaitForNotification(float timeout)
{
var startCount = receivedNotificationCount;
float timePassed = 0;
while (receivedNotificationCount == startCount && timePassed < timeout)
{
yield return null;
timePassed += Time.deltaTime;
}
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator SendNotificationAllOptionsRoundtrip()
{
var notification = new Notification()
{
Identifier = 15,
Title = "Test",
Text = "Testing",
Data = "TestData",
Badge = 2,
};
NotificationCenter.ScheduleNotification(notification, new NotificationIntervalSchedule(TimeSpan.FromSeconds(2)));
yield return new WaitForSeconds(0.5f); // test notification is trully delayed
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual(15, n.Identifier);
Assert.AreEqual("Test", n.Title);
Assert.AreEqual("Testing", n.Text);
Assert.AreEqual("TestData", n.Data);
Assert.AreEqual(2, n.Badge);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleNotificationAtSpecificTime()
{
var notification = new Notification()
{
Title = "AtTime",
Text = "AtSpecificTime",
};
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(2)));
yield return new WaitForSeconds(0.5f); // test notification is trully delayed
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual("AtTime", n.Title);
Assert.AreEqual("AtSpecificTime", n.Text);
Assert.AreNotEqual(0, n.Identifier); // ID should be auto-generated
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleAndCancelNotification_DoesNotArrive()
{
var notification = new Notification()
{
Title = "Cancel",
Text = "To be cancelled",
};
int id = NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return new WaitForSeconds(0.5f);
NotificationCenter.CancelScheduledNotification(id);
yield return WaitForNotification(6.0f);
Assert.AreEqual(0, receivedNotificationCount);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android })]
public IEnumerator ScheduleNotification_WithExplicitCategory_UsesAndroidChannel()
{
#if UNITY_ANDROID
const string category = "the_category";
Unity.Notifications.Android.AndroidNotificationCenter.RegisterNotificationChannel(
new Unity.Notifications.Android.AndroidNotificationChannel()
{
Id = category,
Name = "Category",
Description = "For category testing",
Importance = Unity.Notifications.Android.Importance.Default,
}
);
Unity.Notifications.Android.AndroidNotificationCenter.OnNotificationReceived += OnAndroidNotification;
yield return ScheduleNotification_WithExplicitCategory(category);
Unity.Notifications.Android.AndroidNotificationCenter.OnNotificationReceived -= OnAndroidNotification;
Assert.IsNotNull(lastAndroidNotification);
Assert.AreEqual(category, lastAndroidNotification.Channel);
#else
yield break;
#endif
}
#if UNITY_ANDROID
Unity.Notifications.Android.AndroidNotificationIntentData lastAndroidNotification;
void OnAndroidNotification(Unity.Notifications.Android.AndroidNotificationIntentData intentData)
{
lastAndroidNotification = intentData;
}
#endif
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleNotification_WithExplicitCategory_UsesiOSCategory()
{
#if UNITY_IOS
const string category = "the_category";
yield return ScheduleNotification_WithExplicitCategory(category);
var notification = (Unity.Notifications.iOS.iOSNotification)lastNotification.Value;
Assert.AreEqual(category, notification.CategoryIdentifier);
#else
yield break;
#endif
}
public IEnumerator ScheduleNotification_WithExplicitCategory(string category)
{
var notification = new Notification()
{
Title = "With category",
Text = "Sent to category",
};
NotificationCenter.ScheduleNotification(notification, category, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual("With category", n.Title);
Assert.AreEqual("Sent to category", n.Text);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleNotification_WithoutCategory_UsesNoiOSCategory()
{
var notification = new Notification()
{
Title = "Without category",
Text = "Sent to no category",
};
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual("Without category", n.Title);
Assert.AreEqual("Sent to no category", n.Text);
#if UNITY_IOS
var iosNotification = (Unity.Notifications.iOS.iOSNotification)n;
Assert.IsNull(iosNotification.CategoryIdentifier);
#endif
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleWithSameID_ReplacesNotification()
{
var notification = new Notification()
{
Identifier = 123,
Title = "Replace",
Text = "To be replaced",
};
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(2)));
yield return null;
notification.Text = "Replacement text";
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return WaitForNotification(60.0f);
yield return new WaitForSeconds(5); // wait a bit more in case the second notification does arrive
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual(123, n.Identifier.Value);
Assert.AreEqual("Replace", n.Title);
Assert.AreEqual("Replacement text", n.Text);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleWithoutIDTwice_DeliversTwo()
{
var notification = new Notification()
{
Title = "No replace",
Text = "Not replaced",
};
var id1 = NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(2)));
yield return null;
var id2 = NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
Assert.AreNotEqual(id1, id2);
yield return WaitForNotification(60.0f);
// Both could be batched
if (receivedNotificationCount < 2)
yield return WaitForNotification(60.0f);
Assert.AreEqual(2, receivedNotificationCount);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: df9756fcdfcd6480aa4dcc1daf2d78cb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
{
"name": "Unity.Notifications.Unified.Tests",
"rootNamespace": "",
"references": [
"Unity.Notifications.Android",
"Unity.Notifications.iOS",
"Unity.Notifications.Unified",
"UnityEngine.TestRunner",
"UnityEditor.TestRunner",
"Unity.Notifications"
],
"includePlatforms": [
"Editor",
"Android",
"iOS"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": true,
"precompiledReferences": [
"nunit.framework.dll"
],
"autoReferenced": false,
"defineConstraints": [
"UNITY_INCLUDE_TESTS"
],
"versionDefines": [],
"noEngineReferences": false
}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7cc401a5f39bf44dd915187717042be7
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: