Unity移动端可消耗内购物品跨设备/重装恢复方案咨询
无需登录恢复可消耗内购的实现方案与注意事项
常用实现方案
1. 自定义UUID+Firestore(规避默认匿名用户丢失问题)
Firestore默认匿名用户重装后会失效,但可以通过自定义持久化用户标识解决:
- 首次启动应用时生成唯一UUID(比如
System.Guid.NewGuid().ToString()),将其存储在设备的安全存储中(iOS用Keychain,Android用EncryptedSharedPreferences,禁止用PlayerPrefs,易被篡改)。 - 以这个UUID作为Firestore的文档ID,创建用户专属文档,存储可消耗内购核心数据:购买总量、消耗总量、剩余余额(建议同时存储总量和消耗记录,避免单一数据被篡改)。
- 重装应用后,读取安全存储中的UUID,直接拉取对应Firestore文档的数据恢复余额。
- 跨设备恢复时,结合平台内购恢复API(Apple的
SKPaymentQueue.restoreCompletedTransactions()、Google的BillingClient.queryPurchasesAsync()),获取用户所有已购买记录,同步到Firestore文档中重新计算剩余余额。
2. Unity Economy+安全存储保存匿名凭证
Unity Economy集成了用户系统和内购管理,可通过以下方式实现无登录恢复:
- 使用Unity Authentication的匿名登录功能(
AuthenticationService.Instance.SignInAnonymouslyAsync()),登录成功后将匿名用户的凭证(如refresh token)存储在设备安全存储中。 - 将可消耗内购的余额数据托管在Unity Economy中,购买完成后通过官方API更新余额(必须先完成平台内购验证,防止作弊)。
- 重装应用时,读取安全存储中的凭证,调用
AuthenticationService.Instance.SignInWithTokenAsync()恢复原匿名用户身份,直接获取Unity Economy中的余额数据。 - 跨设备恢复同样依赖平台内购恢复API,将恢复的购买记录同步到Unity Economy中更新余额。
实施前必须注意的问题
- 隐私合规:
- 禁止随意使用
SystemInfo.deviceUniqueIdentifier这类设备标识,iOS的IDFA需用户授权,建议用自定义UUID替代。 - 存储的用户凭证、UUID必须加密,且需在隐私政策中明确告知用户数据存储用途,符合GDPR、CCPA及应用商店的隐私要求。
- 禁止随意使用
- 数据防篡改:
- 所有余额更新操作必须经过服务器端校验(Firestore可通过安全规则限制写入权限,Unity Economy依赖官方服务器校验),客户端仅能发起请求,不能直接修改数据。
- 内购完成后必须调用Apple/Google的官方验证接口校验receipt,确认购买合法后再更新云端余额,杜绝客户端作弊。
- 跨设备恢复的局限性:
- 无登录情况下,跨设备无法自动关联用户,必须提供手动“恢复购买”入口,让用户触发平台内购恢复流程,通过购买记录匹配用户数据。
- 需确保云端记录了每一笔购买的明细(如订单号、购买数量),恢复时可重新计算剩余余额。
- 数据生命周期:
- 确认Firestore文档、Unity Economy匿名用户的保留期限,避免用户长期不活跃导致数据被自动清理,可在后台设置延长保留时间。
- 测试覆盖:
- 必须测试重装应用、清除应用数据、更换设备、跨平台(iOS/Android)恢复等场景,确保数据稳定恢复;同时测试恶意篡改客户端数据的情况,验证服务器端校验的有效性。
内容的提问来源于stack exchange,提问作者user3623413
相关产品推荐
相关产品推荐

