feat: 添加隐私授权检查与处理逻辑,优化用户体验
This commit is contained in:
@@ -24,11 +24,19 @@ export interface WxShareTimelineConfig {
|
||||
query?: string;
|
||||
}
|
||||
|
||||
export interface WxPrivacySettingResult {
|
||||
/** true 表示需要用户确认隐私授权 */
|
||||
needAuthorization: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信小游戏 SDK 工具类
|
||||
* 封装微信平台相关 API,非微信环境下静默降级
|
||||
*/
|
||||
export class WxSDK {
|
||||
/** 隐私授权请求进行中时复用同一个 Promise,避免启动链路重复弹窗 */
|
||||
private static _privacyAuthorizePromise: Promise<boolean> | null = null;
|
||||
|
||||
/**
|
||||
* 是否处于微信小游戏环境
|
||||
*/
|
||||
@@ -76,6 +84,91 @@ export class WxSDK {
|
||||
});
|
||||
}
|
||||
|
||||
// ==================== 隐私授权相关 ====================
|
||||
|
||||
/**
|
||||
* 检查用户是否需要隐私授权。
|
||||
* 低版本或非微信环境没有隐私拦截能力,按已授权处理。
|
||||
*/
|
||||
static checkPrivacySetting(): Promise<WxPrivacySettingResult> {
|
||||
return new Promise((resolve) => {
|
||||
const wxApi = WxSDK.getWx();
|
||||
if (!wxApi) {
|
||||
resolve({ needAuthorization: false });
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof wxApi.getPrivacySetting !== 'function') {
|
||||
console.warn('[WxSDK] 当前微信版本不支持 getPrivacySetting');
|
||||
resolve({ needAuthorization: false });
|
||||
return;
|
||||
}
|
||||
|
||||
wxApi.getPrivacySetting({
|
||||
success: (res: any) => {
|
||||
const needAuthorization = !!res?.needAuthorization;
|
||||
console.log('[WxSDK] 隐私授权检查结果:', res);
|
||||
resolve({ needAuthorization });
|
||||
},
|
||||
fail: (err: any) => {
|
||||
console.warn('[WxSDK] 隐私授权检查失败:', err);
|
||||
resolve({ needAuthorization: true });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 主动触发微信小游戏隐私授权流程。
|
||||
* 已授权用户会直接 success;低版本或非微信环境直接视为通过。
|
||||
*/
|
||||
static requirePrivacyAuthorize(): Promise<boolean> {
|
||||
const wxApi = WxSDK.getWx();
|
||||
if (!wxApi) {
|
||||
console.warn('[WxSDK] 非微信环境,跳过隐私授权');
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
if (typeof wxApi.requirePrivacyAuthorize !== 'function') {
|
||||
console.warn('[WxSDK] 当前微信版本不支持 requirePrivacyAuthorize');
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
if (WxSDK._privacyAuthorizePromise) {
|
||||
return WxSDK._privacyAuthorizePromise;
|
||||
}
|
||||
|
||||
WxSDK._privacyAuthorizePromise = new Promise((resolve) => {
|
||||
wxApi.requirePrivacyAuthorize({
|
||||
success: () => {
|
||||
console.log('[WxSDK] 用户已授权隐私');
|
||||
resolve(true);
|
||||
},
|
||||
fail: (err: any) => {
|
||||
console.warn('[WxSDK] 用户拒绝或授权失败:', err);
|
||||
resolve(false);
|
||||
},
|
||||
complete: () => {
|
||||
WxSDK._privacyAuthorizePromise = null;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return WxSDK._privacyAuthorizePromise;
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动阶段使用的隐私授权入口:主动调用 requirePrivacyAuthorize,
|
||||
* 让微信在合适时机触发官方隐私弹窗逻辑。
|
||||
*/
|
||||
static ensurePrivacyAuthorized(): Promise<boolean> {
|
||||
if (!WxSDK.isWechat()) {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
return WxSDK.requirePrivacyAuthorize();
|
||||
}
|
||||
|
||||
// ==================== 分享相关 ====================
|
||||
|
||||
/**
|
||||
@@ -323,33 +416,7 @@ export class WxSDK {
|
||||
* @returns Promise<{ needAuthorization: boolean }> needAuthorization 为 false 表示已授权
|
||||
*/
|
||||
export async function checkPrivacySetting(): Promise<{ needAuthorization: boolean }> {
|
||||
return new Promise((resolve) => {
|
||||
const wxApi = WxSDK.getWx();
|
||||
if (!wxApi) {
|
||||
// 非微信环境,认为已授权
|
||||
resolve({ needAuthorization: false });
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof wxApi.getPrivacySetting !== 'function') {
|
||||
// 低版本微信,认为已授权
|
||||
console.warn('[WxSDK] 当前微信版本不支持 getPrivacySetting');
|
||||
resolve({ needAuthorization: false });
|
||||
return;
|
||||
}
|
||||
|
||||
wxApi.getPrivacySetting({
|
||||
success: (res: any) => {
|
||||
console.log('[WxSDK] 隐私授权检查结果:', res);
|
||||
resolve({ needAuthorization: res.needAuthorization });
|
||||
},
|
||||
fail: (err: any) => {
|
||||
console.warn('[WxSDK] 隐私授权检查失败:', err);
|
||||
// 检查失败时认为需要授权
|
||||
resolve({ needAuthorization: true });
|
||||
}
|
||||
});
|
||||
});
|
||||
return WxSDK.checkPrivacySetting();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -358,31 +425,10 @@ export async function checkPrivacySetting(): Promise<{ needAuthorization: boolea
|
||||
* @returns Promise<void>
|
||||
*/
|
||||
export async function requirePrivacyAuthorize(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const wxApi = WxSDK.getWx();
|
||||
if (!wxApi) {
|
||||
console.warn('[WxSDK] 非微信环境,跳过隐私授权');
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof wxApi.requirePrivacyAuthorize !== 'function') {
|
||||
console.warn('[WxSDK] 当前微信版本不支持 requirePrivacyAuthorize');
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
wxApi.requirePrivacyAuthorize({
|
||||
success: () => {
|
||||
console.log('[WxSDK] 用户已授权隐私');
|
||||
resolve();
|
||||
},
|
||||
fail: (err: any) => {
|
||||
console.warn('[WxSDK] 用户拒绝或授权失败:', err);
|
||||
reject(new Error(err.errMsg || '隐私授权失败'));
|
||||
}
|
||||
});
|
||||
});
|
||||
const authorized = await WxSDK.requirePrivacyAuthorize();
|
||||
if (!authorized) {
|
||||
throw new Error('隐私授权失败');
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 用户信息相关 ====================
|
||||
|
||||
Reference in New Issue
Block a user