/** * 隐私协议版本号 - 自动跟随 App/小程序版本 * * 【正常流程】 * 每次发版时,开发者只需要改 manifest.json 中的 versionName / versionCode, * 或者发版工具自动改版本号,隐私协议就会自动重新弹窗,无需手动调整此处。 * * 【特殊兜底】 * 如果协议改了但不想发新版 App,把下方 FORCE_REFRESH_FLAG 改成新值即可 * (比如改成日期 '2026-10-01'),所有用户下次启动会重新弹窗。 * 协议没改时保持空字符串 '' 即可。 * * 各端获取版本号方式: * App 端 → plus.runtime.versionCode (manifest.json 中 versionCode) * 小程序端 → uni.getAccountInfoSync().miniProgram.version */ // ====== 兜底强制刷新标志 ====== // 协议变了但 App/小程序版本号没变时,改这里触发重新弹窗 // 保持 '' 不额外触发;改成任意新值(如 '2026-10-01')即可强制所有用户重新同意 const FORCE_REFRESH_FLAG = ''; // 本地存储 key export const PRIVACY_STORAGE_KEY = 'privacy_version'; // 动态获取当前运行端的版本号(含兜底标志) function getCurrentVersion() { let base = ''; // #ifdef APP-PLUS // App 端:用 versionCode(数字,每次发版必变) base = 'app_' + plus.runtime.versionCode; // #endif // #ifdef MP // 小程序端:用微信小程序平台的版本号 try { const info = uni.getAccountInfoSync(); base = 'mp_' + (info.miniProgram.version || info.miniProgram.envVersion || 'dev'); } catch (e) { base = 'mp_unknown'; } // #endif // #ifdef H5 // H5 暂不强制拦截 return 'h5_static'; // #endif // 拼上兜底标志:有值时即使版本号没变也触发重新弹窗 return FORCE_REFRESH_FLAG ? base + '__' + FORCE_REFRESH_FLAG : base; } // 判断是否需要重新弹窗 // 用户同意的版本号 !== 当前运行端版本号 → 需要弹窗 export function needPrivacyPopup() { // #ifdef H5 // H5 不强制拦截 return false; // #endif const current = getCurrentVersion(); const saved = uni.getStorageSync(PRIVACY_STORAGE_KEY); // 没有记录(含老数据 privacy_agreed: true)或版本号不匹配 → 需要弹窗 if (!saved) return true; return saved !== current; } // 标记已同意当前版本的隐私协议 export function markPrivacyAgreed() { const current = getCurrentVersion(); uni.setStorageSync(PRIVACY_STORAGE_KEY, current); }