diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 1828c711..7858b8c8 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -42,6 +42,19 @@ jobs:
onesignal-app-id: ${{ vars.APPIUM_ONESIGNAL_APP_ID }}
onesignal-api-key: ${{ secrets.APPIUM_ONESIGNAL_API_KEY }}
+ - name: Enable E2E accessibility
+ run: |
+ python3 - <<'PY'
+ import json
+ from pathlib import Path
+
+ path = Path("examples/demo/Packages/manifest.json")
+ manifest = json.loads(path.read_text())
+ manifest["dependencies"]["com.unity.modules.accessibility"] = "1.0.0"
+ path.write_text(json.dumps(manifest, indent=2) + "\n")
+ PY
+ printf '%s\n' '-define:ONESIGNAL_E2E_ACCESSIBILITY' > examples/demo/Assets/csc.rsp
+
- name: Resolve OneSignal Android SDK version
id: android-sdk-version
run: |
@@ -61,7 +74,7 @@ jobs:
uses: actions/cache@v5
with:
path: examples/demo/Library
- key: unity-library-android-${{ hashFiles('examples/demo/Packages/manifest.json', 'examples/demo/ProjectSettings/ProjectVersion.txt') }}
+ key: unity-library-android-${{ hashFiles('examples/demo/Packages/manifest.json', 'examples/demo/Assets/csc.rsp', 'examples/demo/ProjectSettings/ProjectVersion.txt') }}
restore-keys: unity-library-android-
- name: Build APK
@@ -72,7 +85,7 @@ jobs:
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with:
projectPath: examples/demo
- unityVersion: auto
+ unityVersion: 6000.4.11f1
targetPlatform: Android
buildMethod: BuildScript.BuildAndroidEmulator
allowDirtyBuild: true
@@ -108,11 +121,24 @@ jobs:
onesignal-app-id: ${{ vars.APPIUM_ONESIGNAL_APP_ID }}
onesignal-api-key: ${{ secrets.APPIUM_ONESIGNAL_API_KEY }}
+ - name: Enable E2E accessibility
+ run: |
+ python3 - <<'PY'
+ import json
+ from pathlib import Path
+
+ path = Path("examples/demo/Packages/manifest.json")
+ manifest = json.loads(path.read_text())
+ manifest["dependencies"]["com.unity.modules.accessibility"] = "1.0.0"
+ path.write_text(json.dumps(manifest, indent=2) + "\n")
+ PY
+ printf '%s\n' '-define:ONESIGNAL_E2E_ACCESSIBILITY' > examples/demo/Assets/csc.rsp
+
- name: Cache Unity Library
uses: actions/cache@v5
with:
path: examples/demo/Library
- key: unity-library-ios-${{ hashFiles('examples/demo/Packages/manifest.json', 'examples/demo/ProjectSettings/ProjectVersion.txt') }}
+ key: unity-library-ios-${{ hashFiles('examples/demo/Packages/manifest.json', 'examples/demo/Assets/csc.rsp', 'examples/demo/ProjectSettings/ProjectVersion.txt') }}
restore-keys: unity-library-ios-
- name: Cache Xcode DerivedData
@@ -123,7 +149,7 @@ jobs:
uses: actions/cache@v5
with:
path: examples/demo/Build/iOS-DerivedData
- key: deriveddata-${{ runner.os }}-${{ hashFiles('examples/demo/Packages/manifest.json', 'examples/demo/ProjectSettings/ProjectVersion.txt', 'examples/demo/ProjectSettings/ProjectSettings.asset', 'com.onesignal.unity.ios/Editor/**', 'com.onesignal.unity.core/Editor/**', 'examples/demo/iOS/ExportOptions.plist') }}
+ key: deriveddata-${{ runner.os }}-${{ hashFiles('examples/demo/Packages/manifest.json', 'examples/demo/Assets/csc.rsp', 'examples/demo/ProjectSettings/ProjectVersion.txt', 'examples/demo/ProjectSettings/ProjectSettings.asset', 'com.onesignal.unity.ios/Editor/**', 'com.onesignal.unity.core/Editor/**', 'examples/demo/iOS/ExportOptions.plist') }}
restore-keys: deriveddata-${{ runner.os }}-
- name: Export Xcode project from Unity
@@ -134,7 +160,7 @@ jobs:
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with:
projectPath: examples/demo
- unityVersion: auto
+ unityVersion: 6000.4.11f1
targetPlatform: iOS
buildMethod: BuildScript.BuildiOSDevice
allowDirtyBuild: true
diff --git a/README.md b/README.md
index 2b14740c..33efc762 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@ And via many additional platforms. [Check them all out](https://documentation.on
## Requirements
- A [OneSignal Account](https://app.onesignal.com/signup) if you do not already have one
- Your OneSignal App ID which you can find under **Settings > Keys & IDs**
-- Unity 2021.3 or newer
+- Unity 2022.3 or newer
- Android Builds: Target API Level 33 or higher
- iOS Builds: CocoaPods 1.11.3 or newer
- In order to test push notifications you will need
diff --git a/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.cs b/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.cs
index 34cf3074..d1b20350 100644
--- a/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.cs
+++ b/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.cs
@@ -37,6 +37,9 @@ internal static class OneSignalAndroidDependencies
{
static OneSignalAndroidDependencies()
{
+ if (AssetDatabase.IsAssetImportWorkerProcess())
+ return;
+
OneSignalSDKSettings.Changed += WriteDependencies;
WriteDependencies();
}
diff --git a/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.cs b/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.cs
index 284af147..4bb5ab62 100644
--- a/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.cs
+++ b/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.cs
@@ -37,6 +37,9 @@ internal static class OneSignaliOSDependencies
{
static OneSignaliOSDependencies()
{
+ if (AssetDatabase.IsAssetImportWorkerProcess())
+ return;
+
OneSignalSDK.OneSignalSDKSettings.Changed += WriteDependencies;
WriteDependencies();
}
diff --git a/examples/demo/Assets/OneSignal/Editor/OneSignalFileInventory.cs b/examples/demo/Assets/OneSignal/Editor/OneSignalFileInventory.cs
index 578cf585..82cf4c52 100644
--- a/examples/demo/Assets/OneSignal/Editor/OneSignalFileInventory.cs
+++ b/examples/demo/Assets/OneSignal/Editor/OneSignalFileInventory.cs
@@ -47,7 +47,9 @@ internal sealed class OneSignalFileInventory : ScriptableObject
public static string[] GetCurrentPaths() =>
ConvertPathsToUnix(
Directory.GetFiles(PackageAssetsPath, "*", SearchOption.AllDirectories)
- );
+ )
+ .Except(GeneratedDependencyPaths)
+ .ToArray();
///
/// Makes sure are using forward slash to be Unix compatible.
@@ -75,5 +77,22 @@ public static string[] ConvertPathsToUnix(string[] paths)
"Resources"
);
public static readonly string AssetPath = Path.Combine(EditorResourcesPath, AssetName);
+ private static readonly string[] GeneratedDependencyPaths = ConvertPathsToUnix(
+ new[]
+ {
+ Path.Combine(
+ PackageAssetsPath,
+ "Editor",
+ "OneSignalAndroidDependencies.xml"
+ ),
+ Path.Combine(
+ PackageAssetsPath,
+ "Editor",
+ "OneSignalAndroidDependencies.xml.meta"
+ ),
+ Path.Combine(PackageAssetsPath, "Editor", "OneSignaliOSDependencies.xml"),
+ Path.Combine(PackageAssetsPath, "Editor", "OneSignaliOSDependencies.xml.meta"),
+ }
+ );
}
}
diff --git a/examples/demo/Assets/OneSignal/README.md b/examples/demo/Assets/OneSignal/README.md
index eeebf702..d47f0675 100644
--- a/examples/demo/Assets/OneSignal/README.md
+++ b/examples/demo/Assets/OneSignal/README.md
@@ -32,7 +32,7 @@ And via many additional platforms. [Check them all out](https://documentation.on
## Requirements
- A [OneSignal Account](https://app.onesignal.com/signup) if you do not already have one
- Your OneSignal App ID which you can find under **Settings > Keys & IDs**
-- Unity 2021.3 or newer
+- Unity 2022.3 or newer
- Android Builds: Target API Level 33 or higher
- iOS Builds: CocoaPods 1.11.3 or newer
- In order to test push notifications you will need
diff --git a/examples/demo/Assets/Scripts/Services/AccessibilityBridge.cs b/examples/demo/Assets/Scripts/Services/AccessibilityBridge.cs
index 1bd63ba9..e1d48891 100644
--- a/examples/demo/Assets/Scripts/Services/AccessibilityBridge.cs
+++ b/examples/demo/Assets/Scripts/Services/AccessibilityBridge.cs
@@ -4,7 +4,9 @@
using System.Globalization;
using System.Reflection;
using UnityEngine;
+#if UNITY_2023_2_OR_NEWER && ONESIGNAL_E2E_ACCESSIBILITY
using UnityEngine.Accessibility;
+#endif
using UnityEngine.UIElements;
namespace OneSignalDemo.Services
@@ -15,6 +17,7 @@ namespace OneSignalDemo.Services
///
public class AccessibilityBridge : MonoBehaviour
{
+#if UNITY_2023_2_OR_NEWER && ONESIGNAL_E2E_ACCESSIBILITY
// GeometryChangedEvent is the hot path; this tick catches drift from sources that
// don't raise it (animation curves, opacity tweens, value mutations).
private const float FrameRefreshIntervalSeconds = 0.05f;
@@ -912,6 +915,19 @@ public IosInfoTap(Func isEnabled, Action action)
Action = action;
}
}
+#endif
+#else
+ public static void EnableForE2E(VisualElement root) { }
+
+ public static void RegisterE2ETapTarget(
+ VisualElement target,
+ Func isEnabled,
+ Action action
+ ) { }
+
+ public static void RequestResync() { }
+
+ public static void RequestImmediateResync() { }
#endif
}
}
diff --git a/examples/demo/Assets/Scripts/UI/Dialogs/DialogBase.cs b/examples/demo/Assets/Scripts/UI/Dialogs/DialogBase.cs
index 17d05433..fb64a938 100644
--- a/examples/demo/Assets/Scripts/UI/Dialogs/DialogBase.cs
+++ b/examples/demo/Assets/Scripts/UI/Dialogs/DialogBase.cs
@@ -98,10 +98,17 @@ protected TextField CreateTextField(string label, string name, string placeholde
field.name = name;
field.AddToClassList("input-field");
if (!string.IsNullOrEmpty(placeholder))
- field.textEdition.placeholder = placeholder;
+ SetPlaceholder(field, placeholder);
return field;
}
+ protected static void SetPlaceholder(TextField field, string placeholder)
+ {
+#if UNITY_2023_1_OR_NEWER
+ field.textEdition.placeholder = placeholder;
+#endif
+ }
+
protected Button CreateConfirmButton(string text, Action onClick)
{
var btn = new Button(onClick);
diff --git a/examples/demo/Assets/Scripts/UI/Dialogs/MultiPairInputDialog.cs b/examples/demo/Assets/Scripts/UI/Dialogs/MultiPairInputDialog.cs
index 987ffd90..e13d8a76 100644
--- a/examples/demo/Assets/Scripts/UI/Dialogs/MultiPairInputDialog.cs
+++ b/examples/demo/Assets/Scripts/UI/Dialogs/MultiPairInputDialog.cs
@@ -100,14 +100,14 @@ private void AddRow()
keyField.name = $"multipair_key_{rowIndex}";
keyField.AddToClassList("input-field");
keyField.AddToClassList("dialog-field-group-left");
- keyField.textEdition.placeholder = _keyLabel;
+ SetPlaceholder(keyField, _keyLabel);
keyField.RegisterValueChangedCallback(_ => ValidateAll());
var valueField = new TextField();
valueField.name = $"multipair_value_{rowIndex}";
valueField.AddToClassList("input-field");
valueField.AddToClassList("dialog-field-group");
- valueField.textEdition.placeholder = _valueLabel;
+ SetPlaceholder(valueField, _valueLabel);
valueField.RegisterValueChangedCallback(_ => ValidateAll());
row.Add(keyField);
diff --git a/examples/demo/Assets/Scripts/UI/Dialogs/OutcomeDialog.cs b/examples/demo/Assets/Scripts/UI/Dialogs/OutcomeDialog.cs
index 0db76afa..0aebbac0 100644
--- a/examples/demo/Assets/Scripts/UI/Dialogs/OutcomeDialog.cs
+++ b/examples/demo/Assets/Scripts/UI/Dialogs/OutcomeDialog.cs
@@ -64,7 +64,7 @@ protected override void BuildContent(VisualElement container)
_nameField = new TextField();
_nameField.name = "outcome_name_input";
_nameField.AddToClassList("input-field");
- _nameField.textEdition.placeholder = "Outcome Name";
+ SetPlaceholder(_nameField, "Outcome Name");
_nameField.RegisterValueChangedCallback(_ => ValidateInput());
container.Add(_nameField);
@@ -74,7 +74,7 @@ protected override void BuildContent(VisualElement container)
_valueField = new TextField();
_valueField.name = "outcome_value_input";
_valueField.AddToClassList("input-field");
- _valueField.textEdition.placeholder = "Value";
+ SetPlaceholder(_valueField, "Value");
_valueField.RegisterValueChangedCallback(_ => ValidateInput());
_valueContainer.Add(_valueField);
diff --git a/examples/demo/Assets/Scripts/UI/Dialogs/TrackEventDialog.cs b/examples/demo/Assets/Scripts/UI/Dialogs/TrackEventDialog.cs
index efa7ff42..b8d9a587 100644
--- a/examples/demo/Assets/Scripts/UI/Dialogs/TrackEventDialog.cs
+++ b/examples/demo/Assets/Scripts/UI/Dialogs/TrackEventDialog.cs
@@ -45,7 +45,7 @@ protected override void BuildContent(VisualElement container)
_propertiesField = new TextField();
_propertiesField.name = "event_properties_input";
_propertiesField.AddToClassList("input-field");
- _propertiesField.textEdition.placeholder = "{\"key\": \"value\"}";
+ SetPlaceholder(_propertiesField, "{\"key\": \"value\"}");
_propertiesField.RegisterValueChangedCallback(_ => ValidateInput());
container.Add(_propertiesField);
diff --git a/examples/demo/Packages/manifest.json b/examples/demo/Packages/manifest.json
index 000faea9..c1656c30 100644
--- a/examples/demo/Packages/manifest.json
+++ b/examples/demo/Packages/manifest.json
@@ -4,7 +4,6 @@
"com.onesignal.unity.core": "file:../../../com.onesignal.unity.core",
"com.onesignal.unity.ios": "file:../../../com.onesignal.unity.ios",
"com.unity.nuget.newtonsoft-json": "3.2.2",
- "com.unity.modules.accessibility": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
"com.unity.modules.uielements": "1.0.0",
"com.unity.modules.unitywebrequest": "1.0.0"
diff --git a/examples/demo/Packages/packages-lock.json b/examples/demo/Packages/packages-lock.json
index 5ea253b1..98454167 100644
--- a/examples/demo/Packages/packages-lock.json
+++ b/examples/demo/Packages/packages-lock.json
@@ -29,12 +29,6 @@
"dependencies": {},
"url": "https://packages.unity.com"
},
- "com.unity.modules.accessibility": {
- "version": "1.0.0",
- "depth": 0,
- "source": "builtin",
- "dependencies": {}
- },
"com.unity.modules.androidjni": {
"version": "1.0.0",
"depth": 0,
diff --git a/examples/demo/README.md b/examples/demo/README.md
index d66c7070..f33ca45c 100644
--- a/examples/demo/README.md
+++ b/examples/demo/README.md
@@ -22,6 +22,10 @@ You can build and install without opening the Unity editor by using the provided
Both scripts accept `--no-install` to build only, `--install-only` to skip rebuilding, and `run-ios.sh` also supports `--open` to open the generated Xcode workspace. Set `UNITY_PATH` if Unity is not at the default location.
+### Unity versions
+
+The demo can be opened directly in Unity 2022.3 or Unity 6. The E2E workflow enables Unity 6's Accessibility module only for automated builds because that module is not available in Unity 2022.3.
+
## Clean Generated State
Use `clean.sh` when you want to retest setup from the Unity Editor or clear build artifacts before switching between dependency configurations: