- Merge VK login/link/check and Review test buttons from dev_rustore - Unify Rustore/GooglePlay SKU format via ChannelHelpers.normalizeSkuList() - Fix ChannelConfig runtime sync: Java InitSDK sets channel from ChannelHelpers.CHANNEL - Fix AndroidMinSdkVersion 25→26 for tuyoosdk compatibility - Fix Flexion AndroidManifest tools:replace missing fullBackupContent value - Add [CHANNEL-VERIFY] debug logs for channel verification Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
155 lines
4.9 KiB
Markdown
155 lines
4.9 KiB
Markdown
# 合并记录: dev_rustore 测试内容 → dev_flexion
|
||
|
||
**日期:** 2026-04-30
|
||
**源分支:** dev_rustore (c105818)
|
||
**目标分支:** dev_flexion (66aa7a9)
|
||
|
||
---
|
||
|
||
## 已合并的文件
|
||
|
||
### 1. sdk-intergration/Assets/Scripts/SDKTest.cs
|
||
|
||
新增 VK 登录/绑定/检查 和 Review 测试按钮及事件处理:
|
||
|
||
**新增字段:**
|
||
- `_loginVkBtn` — VK 登录按钮
|
||
- `_linkVkBtn` — VK 绑定按钮
|
||
- `_checkVkBtn` — VK 检查绑定按钮
|
||
- `_reviewBtn` — 应用评价按钮
|
||
|
||
**新增监听 (Start):**
|
||
```csharp
|
||
_loginVkBtn.onClick.AddListener(() => OnLogin(EAccoutType.hwVkid));
|
||
_linkVkBtn.onClick.AddListener(OnLinkVkId);
|
||
_checkVkBtn.onClick.AddListener(OnCheckVKId);
|
||
_reviewBtn.onClick.AddListener(OnReview);
|
||
```
|
||
|
||
**新增方法:**
|
||
```csharp
|
||
private async void OnLinkVkId() // VK 绑定 → TYSdkFacade.Instance.LinkAccount(EAccoutType.hwVkid)
|
||
private async void OnCheckVKId() // VK 检查 → TYSdkFacade.Instance.LinkCheck(EAccoutType.hwVkid)
|
||
private void OnReview() // 评价 → UnityBridgeFunc.Review()
|
||
```
|
||
|
||
### 2. sdk-intergration/Assets/Scenes/SampleScene.unity
|
||
|
||
直接从 dev_rustore 检出完整文件,包含新增 UI 按钮 GameObject:
|
||
- VK Login 按钮
|
||
- VK Link 按钮
|
||
- VK Check 按钮
|
||
- Review 按钮
|
||
|
||
### 3. sdk-intergration/ProjectSettings/ProjectSettings.asset
|
||
|
||
修复构建错误,将 `AndroidMinSdkVersion` 从 25 提升到 26:
|
||
- **原因:** `tuyoosdk_1.0.0.aar` 声明 minSdkVersion 26,低于此版本会 manifest 合并失败
|
||
- **影响:** 全局生效,所有渠道统一 minSdk 26
|
||
|
||
---
|
||
|
||
## 跳过的文件 (dev_flexion 已有更完善的实现)
|
||
|
||
### TYSdkModel.cs — 跳过
|
||
- dev_rustore: 硬编码 `AccountInfo.hwPayType = "rustore.global.app"`, SKUDetail 写死 Rustore 格式
|
||
- dev_flexion: 使用 `ChannelConfig.Channel` 动态区分渠道,同时兼容 Google/Rustore/Flexion
|
||
- **理由:** dev_flexion 的 `ChannelConfig` 抽象更成熟,无需降级
|
||
|
||
### TYSdkFacade.cs — 跳过
|
||
- dev_rustore: 硬编码 `Channel = "hwVkid"`, 超时 120s
|
||
- dev_flexion: 已有 `Channel => ChannelConfig.Channel`, 动态 `LoginTimeoutSeconds`
|
||
- **理由:** dev_flexion 已包含 VK 映射 `{"vk.global.app", EAccoutType.hwVkid}`, 且抽象更优
|
||
|
||
### TYSdkFacade_Pay.cs — 跳过
|
||
- dev_rustore: `var pType = tysdk.AccountInfo.hwPayType` (硬编码 rustore)
|
||
- dev_flexion: `var pType = ChannelConfig.PayType` (动态配置)
|
||
- **理由:** dev_flexion 的方案已覆盖 rustore 支付类型
|
||
|
||
### UnityBridgeFunc.cs — 跳过
|
||
- dev_rustore: 仅代码格式重排,无功能变更
|
||
- dev_flexion: 已包含 `Review()` 等方法声明
|
||
|
||
---
|
||
|
||
## 构建错误修复
|
||
|
||
```
|
||
Error: uses-sdk:minSdkVersion 25 cannot be smaller than version 26
|
||
declared in library [:tuyoosdk_1.0.0:]
|
||
```
|
||
|
||
**修复:** `ProjectSettings.asset` → `AndroidMinSdkVersion: 25` → `26`
|
||
|
||
**替代方案分析:**
|
||
- `tools:overrideLibrary="com.tuyoo.gamesdk"` (rustore AndroidManifest 已有) 只能绕过 manifest 合并冲突
|
||
- 无法绕过 gradle 层 `processReleaseMainManifest` task 的 minSdkVersion 检查
|
||
- 改 ProjectSettings 是唯一可行方案
|
||
|
||
---
|
||
|
||
## SKU 列表格式统一
|
||
|
||
**问题:** Rustore 和 GooglePlay 返回的商品列表 JSON 字段不同,C# 端用同一个 `SKUDetail` 类反序列化。
|
||
|
||
**方案:** 在 Java 端 `ChannelHelpers.normalizeSkuList()` 中统一格式,C# 端不做渠道判断。
|
||
|
||
### 数据流
|
||
|
||
```
|
||
SDK API → defaultThirdExtend() → ChannelHelpers.normalizeSkuList(msg) → Unity SKUListResult → DeserializeObject<List<SKUDetail>>
|
||
```
|
||
|
||
### 变更文件
|
||
|
||
#### 1. ExtraPluginCfgs/Android/rustore/ChannelHelpers.java — 新增 normalizeSkuList
|
||
|
||
```java
|
||
// 将 Rustore 原始格式转为统一格式:
|
||
// price: "199" (戈比) → "₽1.99"
|
||
// 新增 price_amount_micros: "199" * 10000 = "1990000"
|
||
// 新增 price_currency_code: ← currency 字段
|
||
```
|
||
|
||
#### 2. ExtraPluginCfgs/Android/googleplay/ChannelHelpers.java — 新增 normalizeSkuList
|
||
|
||
```java
|
||
// GooglePlay 格式已是标准,直接原样返回
|
||
public static String normalizeSkuList(String msg) { return msg; }
|
||
```
|
||
|
||
#### 3. ExtraPluginCfgs/Android/flexion/ChannelHelpers.java — 新增 normalizeSkuList
|
||
|
||
```java
|
||
// Flexion 有自己的 SDKHelper.queryProducts(),不走 defaultThirdExtend,编译需要方法存在
|
||
public static String normalizeSkuList(String msg) { return msg; }
|
||
```
|
||
|
||
#### 4. SDKManager.java — defaultThirdExtend 调用 normalizeSkuList
|
||
|
||
```java
|
||
// 回调成功时: result.put("respObj", ChannelHelpers.normalizeSkuList(msg));
|
||
```
|
||
|
||
#### 5. TYSdkModel.cs — SKUDetail 简化
|
||
|
||
```csharp
|
||
// 去掉 Normalize() 方法和 normalized 字段
|
||
// 属性直接用统一字段:
|
||
// ProdPrice => float.Parse(price_amount_micros) / 1000000
|
||
// ProdPriceStr => price
|
||
```
|
||
|
||
#### 6. TYSdkFacade_Pay.cs — SKUListResult 去掉 Normalize 调用
|
||
|
||
```csharp
|
||
// 反序列化后直接赋值,不再调 sku.Normalize()
|
||
```
|
||
|
||
### 扩展新渠道
|
||
|
||
添加新渠道时只需:
|
||
1. 创建 `ExtraPluginCfgs/Android/{channel}/ChannelHelpers.java`
|
||
2. 实现 `normalizeSkuList()` 将该渠道 SKU JSON 转为统一格式
|
||
3. C# 端无需改动
|