shish 2 maanden geleden
bovenliggende
commit
e022aa85d8

+ 1 - 41
ghsApp/src/App.vue

@@ -12,48 +12,8 @@ export default {
 		// 清除角标数字
 		plus.runtime.setBadgeNumber(0);
 		// #endif
-	
-		uni.onPushMessage((res) => {
-			console.log("收到推送消息:",res) //监听推送消息
-			let message = res.data;
-			// 兼容两种可能的数据结构
-			let title = message.aps && message.aps.alert ? message.aps.alert.title : '';
-			let content = message.content || (message.aps && message.aps.alert ? message.aps.alert.body : '');
-			
-			// 提取页面路径(支持 pagesOrder/detail 这样的格式)
-			let pagePath = message.payload && message.payload.page;
-			// 用户点击查看详情,跳转到指定页面
-			// 检查是否需要添加 / 前缀
-			let url = pagePath.startsWith('/') ? pagePath : `/${pagePath}`;
-			
-			// 如果有额外参数,拼接到URL
-			if (message.params || (message.payload && message.payload.params)) {
-				let params = message.params || message.payload.params;
-				let queryString = Object.keys(params).map(key => `${key}=${params[key]}`).join('&');
-				url = `${url}?${queryString}`;
-			}
-			console.log('推送消息跳转页面:', url);
-			
-			// 使用 navigateTo 跳转
-			uni.navigateTo({
-				url: url,
-				fail: (err) => {
-					console.error('页面跳转失败:', err);
-				}
-			});
 
-			// 设置角标
-			let badgeNumber = message.aps && message.aps.badge ? message.aps.badge - 1 : false;
-			if (badgeNumber !== false) {
-				//plus.runtime.setBadgeNumber(badgeNumber);
-
-				// 清除数字
-				plus.runtime.setBadgeNumber(0);
-			} else {
-				// 清除数字
-				plus.runtime.setBadgeNumber(0);
-			}
-		})
+		// 推送消息监听改在登录成功后注册,见 utils/appDevice.js setupAppPushMessageListener
 
 		// 删除缓存
 		if (process.env.NODE_ENV == 'production') {

+ 1 - 0
ghsApp/src/mixins/globalMixins.js

@@ -109,6 +109,7 @@ export default {
 
           this.listenPDAkd()
           this.setUserShopAll()
+          this.$util.afterAppLoginSuccess({ auto: 1 })
           this.init()
         })
       }

+ 48 - 4
ghsApp/src/utils/appDevice.js

@@ -187,12 +187,51 @@ export function setupAppDeviceId(onComplete) {
 	// #endif
 }
 
+let pushMessageListenerRegistered = false
+
+/**
+ * 登录成功后再注册推送消息监听,避免冷启动触发推送通道初始化
+ */
+export function setupAppPushMessageListener() {
+	// #ifdef APP-PLUS
+	if (pushMessageListenerRegistered) {
+		return
+	}
+	pushMessageListenerRegistered = true
+	uni.onPushMessage((res) => {
+		console.log('收到推送消息:', res)
+		const message = res.data
+		const pagePath = message.payload && message.payload.page
+		if (!pagePath) {
+			return
+		}
+		let url = pagePath.startsWith('/') ? pagePath : `/${pagePath}`
+		if (message.params || (message.payload && message.payload.params)) {
+			const params = message.params || message.payload.params
+			const queryString = Object.keys(params).map(key => `${key}=${params[key]}`).join('&')
+			url = `${url}?${queryString}`
+		}
+		console.log('推送消息跳转页面:', url)
+		uni.navigateTo({
+			url: url,
+			fail: (err) => {
+				console.error('页面跳转失败:', err)
+			}
+		})
+		plus.runtime.setBadgeNumber(0)
+	})
+	// #endif
+}
+
 /**
  * 登录成功后同步推送 clientId(仅 App 端)
  */
 export function syncAppPushClientId(auto = 0) {
 	// #ifdef APP-PLUS
 	try {
+		if (plus.os.name !== 'iOS' && isAndroid13Plus() && !areAndroidNotificationsEnabled()) {
+			return
+		}
 		const clientInfo = plus.push.getClientInfo()
 		const currentClientId = clientInfo && clientInfo.clientid ? clientInfo.clientid : ''
 		const deviceId = uni.getStorageSync('deviceId')
@@ -205,20 +244,25 @@ export function syncAppPushClientId(auto = 0) {
 	// #endif
 }
 
+function finishAppPushSetup(auto) {
+	setupAppPushMessageListener()
+	syncAppPushClientId(auto)
+}
+
 /**
- * 用户登录成功后:获取设备 ID → 用户确认后申请通知权限 → 同步推送 clientId
+ * 用户登录成功后:获取设备 ID → 用户确认后申请通知权限 → 注册推送监听 → 同步推送 clientId
  * @param {{ auto?: number }} options auto=1 表示静默恢复登录,auto=0 表示用户主动登录
  */
 export function afterAppLoginSuccess(options = {}) {
 	const auto = options.auto !== undefined ? options.auto : 0
 	setupAppDeviceId(() => {
 		if (auto === 1) {
-			// 冷启动自动恢复登录:不弹通知授权,仅尝试同步 clientId
-			syncAppPushClientId(auto)
+			// 冷启动自动恢复登录:不弹通知授权,仅注册监听并尝试同步 clientId
+			finishAppPushSetup(auto)
 			return
 		}
 		requestAppNotificationPermission(() => {
-			syncAppPushClientId(auto)
+			finishAppPushSetup(auto)
 		})
 	})
 }

+ 1 - 37
hdApp/src/App.vue

@@ -22,44 +22,8 @@ export default {
 	plus.runtime.setBadgeNumber(0);
 	// #endif
 
-    uni.onPushMessage((res) => {
-			console.log("收到推送消息:",res) //监听推送消息
-			let message = res.data;
-		  	// 提取页面路径(支持 pagesOrder/detail 这样的格式)
-      		let pagePath = message.payload && message.payload.page;
-			// 用户点击查看详情,跳转到指定页面
-			// 检查是否需要添加 / 前缀
-			let url = pagePath.startsWith('/') ? pagePath : `/${pagePath}`;
-			
-			// 如果有额外参数,拼接到URL
-			if (message.params || (message.payload && message.payload.params)) {
-				let params = message.params || message.payload.params;
-				let queryString = Object.keys(params).map(key => `${key}=${params[key]}`).join('&');
-				url = `${url}?${queryString}`;
-			}
-			console.log('推送消息跳转页面:', url);
-			
-			// 使用 navigateTo 跳转
-			uni.navigateTo({
-				url: url,
-				fail: (err) => {
-					console.error('页面跳转失败:', err);
-				}
-			});
+    // 推送消息监听改在登录成功后注册,见 utils/appDevice.js setupAppPushMessageListener
 
-			// 设置角标
-			let badgeNumber = message.aps && message.aps.badge ? message.aps.badge - 1 : false;
-			if (badgeNumber !== false) {
-				//plus.runtime.setBadgeNumber(badgeNumber);
-
-				// 清除数字
-				plus.runtime.setBadgeNumber(0);
-			} else {
-				// 清除数字
-				plus.runtime.setBadgeNumber(0);
-			}
-		})
-    
     // #ifdef H5
     // H5开发环境无法微信授权,使用固定的用户 shish 2020.4.30
     if (process.env.NODE_ENV == "development") {

+ 1 - 0
hdApp/src/mixins/globalMixins.js

@@ -99,6 +99,7 @@ export default {
 						})
 						that.$store.commit('setLoginInfo', { ...subRes.data.admin, ...subRes.data })
 						that.setUserShopAll()
+						that.$util.afterAppLoginSuccess({ auto: 1 })
 						that.init()
 					}
 				})

+ 48 - 4
hdApp/src/utils/appDevice.js

@@ -187,12 +187,51 @@ export function setupAppDeviceId(onComplete) {
 	// #endif
 }
 
+let pushMessageListenerRegistered = false
+
+/**
+ * 登录成功后再注册推送消息监听,避免冷启动触发推送通道初始化
+ */
+export function setupAppPushMessageListener() {
+	// #ifdef APP-PLUS
+	if (pushMessageListenerRegistered) {
+		return
+	}
+	pushMessageListenerRegistered = true
+	uni.onPushMessage((res) => {
+		console.log('收到推送消息:', res)
+		const message = res.data
+		const pagePath = message.payload && message.payload.page
+		if (!pagePath) {
+			return
+		}
+		let url = pagePath.startsWith('/') ? pagePath : `/${pagePath}`
+		if (message.params || (message.payload && message.payload.params)) {
+			const params = message.params || message.payload.params
+			const queryString = Object.keys(params).map(key => `${key}=${params[key]}`).join('&')
+			url = `${url}?${queryString}`
+		}
+		console.log('推送消息跳转页面:', url)
+		uni.navigateTo({
+			url: url,
+			fail: (err) => {
+				console.error('页面跳转失败:', err)
+			}
+		})
+		plus.runtime.setBadgeNumber(0)
+	})
+	// #endif
+}
+
 /**
  * 登录成功后同步推送 clientId(仅 App 端)
  */
 export function syncAppPushClientId(auto = 0) {
 	// #ifdef APP-PLUS
 	try {
+		if (plus.os.name !== 'iOS' && isAndroid13Plus() && !areAndroidNotificationsEnabled()) {
+			return
+		}
 		const clientInfo = plus.push.getClientInfo()
 		const currentClientId = clientInfo && clientInfo.clientid ? clientInfo.clientid : ''
 		const deviceId = uni.getStorageSync('deviceId')
@@ -205,20 +244,25 @@ export function syncAppPushClientId(auto = 0) {
 	// #endif
 }
 
+function finishAppPushSetup(auto) {
+	setupAppPushMessageListener()
+	syncAppPushClientId(auto)
+}
+
 /**
- * 用户登录成功后:获取设备 ID → 用户确认后申请通知权限 → 同步推送 clientId
+ * 用户登录成功后:获取设备 ID → 用户确认后申请通知权限 → 注册推送监听 → 同步推送 clientId
  * @param {{ auto?: number }} options auto=1 表示静默恢复登录,auto=0 表示用户主动登录
  */
 export function afterAppLoginSuccess(options = {}) {
 	const auto = options.auto !== undefined ? options.auto : 0
 	setupAppDeviceId(() => {
 		if (auto === 1) {
-			// 冷启动自动恢复登录:不弹通知授权,仅尝试同步 clientId
-			syncAppPushClientId(auto)
+			// 冷启动自动恢复登录:不弹通知授权,仅注册监听并尝试同步 clientId
+			finishAppPushSetup(auto)
 			return
 		}
 		requestAppNotificationPermission(() => {
-			syncAppPushClientId(auto)
+			finishAppPushSetup(auto)
 		})
 	})
 }