diff --git a/CHANGELOG.md b/CHANGELOG.md
index fde4a81..9a3310b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
本文件记录 `ShrinkDataSaver.Integration.App` 的包内变更。
+## [0.3.0] - 2026-11-06
+
+### Added
+
+- 新增 `ShrinkDataSaverAppModuleConfig`,可同时传入 `ShrinkAppServices` 和自定义 `ShrinkDataSaverRuntimeConfig`。
+- `ShrinkDataSaverAppComponent` 新增接收运行时配置的构造函数。
+
+### Changed
+
+- App 停止时等待 `ShrinkSettings.SaveAsync()` 完成,并把写入失败传播到停用链,不再 fire-and-forget。
+- 精确依赖 `ShrinkDataSaver 2.5.0`、`ShrinkSDK.Runtime.Abstractions 0.2.0`。
+
## [0.1.3] - 2026-08-28
### Changed
diff --git a/DotNet~/ShrinkSDK.DataSaver.Integration.App.csproj b/DotNet~/ShrinkSDK.DataSaver.Integration.App.csproj
index 420ff87..3eb6eaf 100644
--- a/DotNet~/ShrinkSDK.DataSaver.Integration.App.csproj
+++ b/DotNet~/ShrinkSDK.DataSaver.Integration.App.csproj
@@ -5,16 +5,16 @@
ShrinkDataSaver.Integration.App
ShrinkDataSaver.Integration.App
ShrinkSDK.DataSaver.Integration.App
- 0.2.5
+ 0.3.1
ShrinkDataSaver and App host integration.
true
-
-
-
-
+
+
+
+
diff --git a/Runtime/ShrinkDataSaverAppComponent.cs b/Runtime/ShrinkDataSaverAppComponent.cs
index eb4b021..9fd6dfa 100644
--- a/Runtime/ShrinkDataSaverAppComponent.cs
+++ b/Runtime/ShrinkDataSaverAppComponent.cs
@@ -21,6 +21,16 @@ namespace ShrinkDataSaver.Integration.App
public const string ModuleKey = "app.module.shrink.datasaver";
private static readonly string[] ProvideKeys = { ModuleKey, ServiceKey };
+ private readonly ShrinkDataSaverRuntimeConfig? _runtimeConfig;
+
+ public ShrinkDataSaverAppComponent()
+ {
+ }
+
+ public ShrinkDataSaverAppComponent(ShrinkDataSaverRuntimeConfig? runtimeConfig)
+ {
+ _runtimeConfig = runtimeConfig;
+ }
public string Name => "shrink.datasaver";
@@ -28,22 +38,27 @@ namespace ShrinkDataSaver.Integration.App
public IReadOnlyList Provide => ProvideKeys;
- public async UniTask ApplyAsync(ShrinkCtx ctx, object? config)
+ public UniTask ApplyAsync(ShrinkCtx ctx, object? config)
{
- // 编辑器/EditMode 环境下 DontDestroyOnLoad 会抛异常,驱动只在播放模式常驻
- ShrinkDataSaverRuntime.Initialize(new ShrinkDataSaverRuntimeConfig
+ ShrinkAppServices? appServices = null;
+ var runtimeConfig = _runtimeConfig ?? CreateDefaultRuntimeConfig();
+ if (config is ShrinkDataSaverAppModuleConfig moduleConfig)
{
-#if UNITY_5_3_OR_NEWER
- DontDestroyOnLoadDriver = UnityEngine.Application.isPlaying
-#else
- DontDestroyOnLoadDriver = false
-#endif
- });
+ appServices = moduleConfig.Services;
+ if (moduleConfig.RuntimeConfig != null)
+ runtimeConfig = moduleConfig.RuntimeConfig;
+ }
+ else if (config is ShrinkAppServices services)
+ {
+ appServices = services;
+ }
+
+ ShrinkDataSaverRuntime.Initialize(runtimeConfig);
var facade = new ShrinkDataSaverService();
ctx.Set(ServiceKey, facade, new ShrinkDataSaverAccessPolicy(facade));
ctx.Set(ModuleKey, Name);
- if (config is ShrinkAppServices appServices)
+ if (appServices != null)
{
appServices.Register(facade);
ctx.EffectInverse(() =>
@@ -53,17 +68,24 @@ namespace ShrinkDataSaver.Integration.App
});
}
- await ctx.EffectAsync(async () =>
+ ctx.EffectInverse(async () =>
{
- await UniTask.CompletedTask;
- return () =>
- {
- // 终止动作(触发式):停用时把防抖中的设置写盘。
- // 磁盘 IO 在线程池完成,不阻塞停用链;未初始化环境安全跳过(SaveAsync 守卫)。
- ShrinkSettings.SaveAsync().Forget();
- return UniTask.CompletedTask;
- };
+ await ShrinkSettings.SaveAsync();
});
+ return UniTask.CompletedTask;
+ }
+
+ private static ShrinkDataSaverRuntimeConfig CreateDefaultRuntimeConfig()
+ {
+ // 编辑器/EditMode 环境下 DontDestroyOnLoad 会抛异常,驱动只在播放模式常驻
+ return new ShrinkDataSaverRuntimeConfig
+ {
+#if UNITY_5_3_OR_NEWER
+ DontDestroyOnLoadDriver = UnityEngine.Application.isPlaying
+#else
+ DontDestroyOnLoadDriver = false
+#endif
+ };
}
}
}
diff --git a/Runtime/ShrinkDataSaverAppModuleConfig.cs b/Runtime/ShrinkDataSaverAppModuleConfig.cs
new file mode 100644
index 0000000..d02e51b
--- /dev/null
+++ b/Runtime/ShrinkDataSaverAppModuleConfig.cs
@@ -0,0 +1,23 @@
+#nullable enable
+
+using ShrinkApp;
+
+namespace ShrinkDataSaver.Integration.App
+{
+ public sealed class ShrinkDataSaverAppModuleConfig
+ {
+ public ShrinkDataSaverAppModuleConfig()
+ {
+ }
+
+ public ShrinkDataSaverAppModuleConfig(ShrinkAppServices? services,
+ ShrinkDataSaverRuntimeConfig? runtimeConfig = null)
+ {
+ Services = services;
+ RuntimeConfig = runtimeConfig;
+ }
+
+ public ShrinkAppServices? Services { get; set; }
+ public ShrinkDataSaverRuntimeConfig? RuntimeConfig { get; set; }
+ }
+}
diff --git a/Runtime/ShrinkDataSaverAppModuleConfig.cs.meta b/Runtime/ShrinkDataSaverAppModuleConfig.cs.meta
new file mode 100644
index 0000000..716b9e1
--- /dev/null
+++ b/Runtime/ShrinkDataSaverAppModuleConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bd27f288ce72493889806887d825b37d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/package.json b/package.json
index 62c0f83..5682820 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,14 @@
{
"name": "com.cneicy.shrink-datasaver-integration-app",
- "version": "0.2.5",
+ "version": "0.3.1",
"displayName": "ShrinkDataSaver - App Integration",
"description": "ShrinkDataSaver 与 ShrinkApp 的桥接层,提供宿主接管初始化与服务注册。",
"unity": "2022.3",
"dependencies": {
- "com.cneicy.shrink-datasaver": "2.4.0",
- "com.cneicy.shrink-app-core": "0.2.3",
+ "com.cneicy.shrink-datasaver": "2.5.0",
+ "com.cneicy.shrink-app-core": "0.2.4",
"com.cysharp.unitask": "2.5.10",
- "com.cneicy.shrink-context-core": "0.3.0"
+ "com.cneicy.shrink-context-core": "0.3.1"
},
"keywords": [
"save",