108 lines
4.1 KiB
C#
108 lines
4.1 KiB
C#
#if UNITY_IOS
|
||||
|
|
using System;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using UnityEditor.Build;
|
|||
|
|
using UnityEditor.Build.Reporting;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public class NotificationAutoConfig : IPreprocessBuildWithReport
|
|||
|
|
{
|
|||
|
|
public int callbackOrder => 0;
|
|||
|
|
|
|||
|
|
public void OnPreprocessBuild(BuildReport report)
|
|||
|
|
{
|
|||
|
|
if (report.summary.platform != BuildTarget.iOS) return;
|
|||
|
|
|
|||
|
|
// 1. 构造文件绝对路径
|
|||
|
|
string settingsPath = "ProjectSettings/NotificationsSettings.asset";
|
|||
|
|
string fullPath = Path.GetFullPath(Path.Combine(Application.dataPath, "..", settingsPath));
|
|||
|
|
|
|||
|
|
if (!File.Exists(fullPath))
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"[NotificationAutoConfig] 文件不存在: {fullPath}");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. 通过反射获取 NotificationSettingsManager 类型
|
|||
|
|
Type managerType = null;
|
|||
|
|
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
|
|||
|
|
{
|
|||
|
|
managerType = asm.GetType("Unity.Notifications.NotificationSettingsManager");
|
|||
|
|
if (managerType != null) break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (managerType == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("[NotificationAutoConfig] 无法找到 NotificationSettingsManager 类型。");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3. 读取文件 JSON,创建 Manager 实例并用 JSON 覆盖数据
|
|||
|
|
string json = File.ReadAllText(fullPath);
|
|||
|
|
ScriptableObject managerInstance = ScriptableObject.CreateInstance(managerType);
|
|||
|
|
EditorJsonUtility.FromJsonOverwrite(json, managerInstance);
|
|||
|
|
|
|||
|
|
// 4. 获取 m_iOSNotificationSettingsValues 字段(NotificationSettingsCollection)
|
|||
|
|
FieldInfo settingsField = managerType.GetField("m_iOSNotificationSettingsValues",
|
|||
|
|
BindingFlags.NonPublic | BindingFlags.Instance);
|
|||
|
|
if (settingsField == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("[NotificationAutoConfig] 找不到 m_iOSNotificationSettingsValues 字段。");
|
|||
|
|
ScriptableObject.DestroyImmediate(managerInstance);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
object iOSSettings = settingsField.GetValue(managerInstance);
|
|||
|
|
if (iOSSettings == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("[NotificationAutoConfig] m_iOSNotificationSettingsValues 为 null。");
|
|||
|
|
ScriptableObject.DestroyImmediate(managerInstance);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 5. 获取索引器(this[string key])
|
|||
|
|
Type collectionType = iOSSettings.GetType();
|
|||
|
|
PropertyInfo indexer = collectionType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
if (indexer == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("[NotificationAutoConfig] 无法找到 NotificationSettingsCollection 的索引器。");
|
|||
|
|
ScriptableObject.DestroyImmediate(managerInstance);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 6. 修改目标键的值
|
|||
|
|
bool changed = false;
|
|||
|
|
changed |= SetSettingValue(indexer, iOSSettings, "UnityNotificationRequestAuthorizationOnAppLaunch", false);
|
|||
|
|
changed |= SetSettingValue(indexer, iOSSettings, "UnityAddRemoteNotificationCapability", true);
|
|||
|
|
changed |= SetSettingValue(indexer, iOSSettings, "UnityUseAPSReleaseEnvironment", true);
|
|||
|
|
|
|||
|
|
// 7. 写回文件并刷新
|
|||
|
|
if (changed)
|
|||
|
|
{
|
|||
|
|
string newJson = EditorJsonUtility.ToJson(managerInstance, true);
|
|||
|
|
File.WriteAllText(fullPath, newJson);
|
|||
|
|
AssetDatabase.Refresh();
|
|||
|
|
Debug.Log("[NotificationAutoConfig] iOS 通知配置已成功更新。");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.Log("[NotificationAutoConfig] 配置已是预期状态,无需修改。");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ScriptableObject.DestroyImmediate(managerInstance);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool SetSettingValue(PropertyInfo indexer, object collection, string key, bool value)
|
|||
|
|
{
|
|||
|
|
object current = indexer.GetValue(collection, new object[] { key });
|
|||
|
|
if (current is bool b && b == value)
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
indexer.SetValue(collection, value, new object[] { key });
|
|||
|
|
Debug.Log($"[NotificationAutoConfig] 修改 {key} = {value}");
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|