Răsfoiți Sursa

动态跳转app白屏

zhuli 1 săptămână în urmă
părinte
comite
9e13becb60
1 a modificat fișierele cu 131 adăugiri și 130 ștergeri
  1. 131 130
      HBuilderProjects/shareDynamic.html

+ 131 - 130
HBuilderProjects/shareDynamic.html

@@ -801,49 +801,6 @@
 			return pathPart.replace(/^\/+/, '');
 			return pathPart.replace(/^\/+/, '');
 		}
 		}
 
 
-		function appendFromShareDynamicToRaw(qs) {
-			var s = String(qs || '').trim();
-			if (!s) return 'fromShareDynamic=1';
-			var pad = '&' + s + '&';
-			if (/[&?](fromShareDynamic|FROMSHAREDYNAMIC)=/i.test(pad)) return s;
-			return s + '&fromShareDynamic=1';
-		}
-
-		function rawQueryHasItem(qs) {
-			return /(?:^|&)item=/i.test('&' + String(qs || '') + '&');
-		}
-
-		/**
-		 * 分享链常把完整 query 放在 hash:#/pages/newdetails/index?item=%257B…&needShowMore=true&fromHomeFeed=1
-		 * 优先取含 item 的原始串,避免 URLSearchParams 截断 item 内 & 或二次编码不一致。
-		 */
-		function getRawShareQueryForAppOpen() {
-			var rawSearch =
-				location.search && location.search.length > 1 ? location.search.slice(1) : '';
-			var hash0 = location.hash || '';
-			var hqi0 = hash0.indexOf('?');
-			var rawHashQ = hqi0 >= 0 ? hash0.slice(hqi0 + 1) : '';
-			var hashPath = extractUniPagePathFromHash();
-			var isNewdetailsHash = hashPath && /newdetails/i.test(hashPath);
-
-			if (isNewdetailsHash && rawHashQ && rawQueryHasItem(rawHashQ)) {
-				return rawHashQ;
-			}
-			if (rawSearch && rawQueryHasItem(rawSearch)) {
-				return rawSearch;
-			}
-			if (isNewdetailsHash && rawHashQ) {
-				return rawHashQ;
-			}
-			if (rawSearch && !rawHashQ) {
-				return rawSearch;
-			}
-			if (!rawSearch && rawHashQ) {
-				return rawHashQ;
-			}
-			return '';
-		}
-
 		/** App shopro / wx extinfo:item 须双重 URL 编码;若已是 %257B… 则不再编码 */
 		/** App shopro / wx extinfo:item 须双重 URL 编码;若已是 %257B… 则不再编码 */
 		function formatItemForShoproQuery(rawItem) {
 		function formatItemForShoproQuery(rawItem) {
 			var s = String(rawItem || '').trim();
 			var s = String(rawItem || '').trim();
@@ -866,14 +823,121 @@
 			return encodeURIComponent(encodeURIComponent(s));
 			return encodeURIComponent(encodeURIComponent(s));
 		}
 		}
 
 
-		function buildAppOpenQueryStringMerged() {
+		/**
+		 * 与 shareIndex buildAppLaunchQueryParams 类似:先解析 sourceId/sourceType/userId,
+		 * 再拼有序 query,避免 fromHomeFeed=1 触发首页种子导致 newdetails「操作无效」。
+		 */
+		function resolveShareDynamicLaunchMeta() {
+			var blob = parseShareDynamicItemBlob();
+			if (!blob) blob = parseOptionsItem();
+			var sourceId =
+				getMergedParam('sourceId') ||
+				getMergedParam('dynamicId') ||
+				getMergedParam('id') ||
+				q('dynamicId') ||
+				q('id');
+			if (!sourceId && blob && blob.id != null && String(blob.id).trim() !== '') {
+				sourceId = String(blob.id);
+			}
+			var sourceType =
+				getMergedParam('sourceType') ||
+				getMergedParam('businessType') ||
+				q('sourceType') ||
+				q('businessType');
+			if (!sourceType && blob && blob.type != null && String(blob.type).trim() !== '') {
+				sourceType = String(blob.type);
+			}
+			var userId = getMergedParam('userId') || q('userId');
+			if (!userId && blob) {
+				if (blob.userId != null && String(blob.userId).trim() !== '') {
+					userId = String(blob.userId);
+				} else if (blob.createdUserId != null && String(blob.createdUserId).trim() !== '') {
+					userId = String(blob.createdUserId);
+				}
+			}
+			return {
+				blob: blob,
+				sourceId: String(sourceId || '').trim(),
+				sourceType: String(sourceType || '').trim(),
+				userId: String(userId || '').trim()
+			};
+		}
+
+		/**
+		 * 固定顺序:item → needShowMore → fromHomeFeed(0) → fromShareDynamic(1) → sourceId/dynamicId/sourceType/userId → 其余
+		 * compact:微信 extinfo 超长时不带 item,仅 id 类参数(App 内再拉详情)
+		 */
+		function buildShareDynamicLaunchSegs(options) {
+			options = options || {};
+			var compact = !!options.compact;
 			var params = mergeSearchAndHashParams();
 			var params = mergeSearchAndHashParams();
+			var meta = resolveShareDynamicLaunchMeta();
+			var segs = [];
+			var skipKeys = {
+				item: 1,
+				needshowmore: 1,
+				fromhomefeed: 1,
+				fromsharedynamic: 1,
+				sourceid: 1,
+				dynamicid: 1,
+				sourcetype: 1,
+				userid: 1,
+				id: 1
+			};
+
+			if (!compact) {
+				var itemForShopro = '';
+				try {
+					itemForShopro = getMergedParam('item');
+				} catch (eGi) {
+					itemForShopro = '';
+				}
+				if (!itemForShopro || String(itemForShopro).trim() === '') {
+					itemForShopro = params.get('item') || '';
+				}
+				if (itemForShopro && String(itemForShopro).trim()) {
+					segs.push('item=' + formatItemForShoproQuery(itemForShopro));
+				}
+			}
+
+			var nsmRaw = params.get('needShowMore');
+			var nsmOut =
+				nsmRaw != null && String(nsmRaw).trim() !== '' ? String(nsmRaw).trim() : 'true';
+			segs.push('needShowMore=' + encodeURIComponent(nsmOut));
+			/** 分享 H5 唤起:勿用首页种子 fromHomeFeed=1,否则 newdetails 易白屏并提示「操作无效」 */
+			segs.push('fromHomeFeed=0');
+			segs.push('fromShareDynamic=1');
 
 
-			var rawQs = getRawShareQueryForAppOpen();
-			if (rawQs) {
-				return '?' + appendFromShareDynamicToRaw(rawQs);
+			if (meta.sourceId) {
+				segs.push('sourceId=' + encodeURIComponent(meta.sourceId));
+				segs.push('dynamicId=' + encodeURIComponent(meta.sourceId));
+			}
+			if (meta.sourceType) {
+				segs.push('sourceType=' + encodeURIComponent(meta.sourceType));
+			}
+			if (meta.userId) {
+				segs.push('userId=' + encodeURIComponent(meta.userId));
 			}
 			}
 
 
+			if (!compact) {
+				params.forEach(function (val, key) {
+					var kl = String(key || '')
+						.trim()
+						.toLowerCase();
+					if (!kl || skipKeys[kl]) return;
+					if (val == null) return;
+					var vs = String(val);
+					if (vs === '') return;
+					segs.push(encodeURIComponent(key) + '=' + encodeURIComponent(vs));
+				});
+			}
+
+			return segs;
+		}
+
+		function buildAppOpenQueryStringMerged() {
+			var params = mergeSearchAndHashParams();
+
 			/** newdetails onLoad:仅当地址栏未带 item 时补全;同时按需补顶层 imagePath */
 			/** newdetails onLoad:仅当地址栏未带 item 时补全;同时按需补顶层 imagePath */
 			if (!params.has('item')) {
 			if (!params.has('item')) {
 				var itemObj = parseOptionsItem();
 				var itemObj = parseOptionsItem();
@@ -962,51 +1026,7 @@
 					}
 					}
 				}
 				}
 			} catch (eShareCk) {}
 			} catch (eShareCk) {}
-			/**
-			 * 与微信落地 shareDynamic、group_user buildDynamicShareH5FullUrl 一致:**item 双重 URL 编码**,
-			 * 顺序 `item & needShowMore & fromHomeFeed & fromShareDynamic=1 & 其余`;fromHomeFeed 仍带给 App,
-			 * newdetails 在 fromShareDynamic=1 时忽略其「首页种子」语义。
-			 */
-			params.delete('fromShareDynamic');
-			var itemForShopro = '';
-			try {
-				itemForShopro = getMergedParam('item');
-			} catch (eGi) {
-				itemForShopro = '';
-			}
-			if (!itemForShopro || String(itemForShopro).trim() === '') {
-				itemForShopro = params.get('item') || '';
-			}
-			var nsmRaw = params.get('needShowMore');
-			var nsmOut =
-				nsmRaw != null && String(nsmRaw).trim() !== '' ? String(nsmRaw).trim() : 'true';
-			var fhfRaw = params.get('fromHomeFeed');
-			var fhfOut =
-				fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
-			var segs = [];
-			if (itemForShopro && String(itemForShopro).trim()) {
-				segs.push('item=' + formatItemForShoproQuery(itemForShopro));
-			}
-			segs.push('needShowMore=' + encodeURIComponent(nsmOut));
-			segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
-			segs.push('fromShareDynamic=1');
-			var skipShoproKeys = {
-				item: 1,
-				needshowmore: 1,
-				fromhomefeed: 1,
-				fromsharedynamic: 1
-			};
-			params.forEach(function (val, key) {
-				var kl = String(key || '')
-					.trim()
-					.toLowerCase();
-				if (!kl || skipShoproKeys[kl]) return;
-				if (val == null) return;
-				var vs = String(val);
-				if (vs === '') return;
-				segs.push(encodeURIComponent(key) + '=' + encodeURIComponent(vs));
-			});
-			return '?' + segs.join('&');
+			return '?' + buildShareDynamicLaunchSegs({ compact: false }).join('&');
 		}
 		}
 
 
 		/**
 		/**
@@ -1086,57 +1106,38 @@
 		}
 		}
 
 
 		/**
 		/**
-		 * wx-open-launch-app extinfo:与 buildAppUniPageLaunchUrl 一致,pages/newdetails/index?item=双重编码…
-		 * 微信 extinfo 上限 1024 字符;超长时保留 item+needShowMore+fromHomeFeed+fromShareDynamic,仍超长则退化为 dynamicId。
+		 * wx-open-launch-app extinfo:与 buildAppUniPageLaunchUrl 一致(参照 shareIndex 短参数 + 有序 query)
+		 * 微信 extinfo 上限 1024;超长时去掉 item,保留 sourceId/sourceType/userId。
 		 */
 		 */
 		function buildWeChatLaunchExtinfo() {
 		function buildWeChatLaunchExtinfo() {
-			var uniPage = buildAppUniPageLaunchUrl();
-			if (uniPage.length <= 1024) return uniPage;
+			var path = getAppUniPathForShareDynamic().replace(/^\//, '');
+			var fullQs = buildShareDynamicLaunchSegs({ compact: false }).join('&');
+			var fullPage = fullQs ? path + '?' + fullQs : path;
+			if (fullPage.length <= 1024) return fullPage;
 
 
-			var path = getAppUniPathForShareDynamic();
 			if (!/newdetails/i.test(path)) {
 			if (!/newdetails/i.test(path)) {
 				var deepOther = buildAppDeepLink().replace(/^shopro:\/\//i, '');
 				var deepOther = buildAppDeepLink().replace(/^shopro:\/\//i, '');
 				if (deepOther.length <= 1024) return deepOther;
 				if (deepOther.length <= 1024) return deepOther;
 				return deepOther.slice(0, 1024);
 				return deepOther.slice(0, 1024);
 			}
 			}
 
 
-			var itemEnc = '';
-			try {
-				var rawItem = getMergedParam('item');
-				if (rawItem) itemEnc = formatItemForShoproQuery(rawItem);
-			} catch (eItem) {}
-			var nsmRaw = getMergedParam('needShowMore');
-			var nsmOut =
-				nsmRaw != null && String(nsmRaw).trim() !== '' ? String(nsmRaw).trim() : 'true';
-			var fhfRaw = getMergedParam('fromHomeFeed');
-			var fhfOut =
-				fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
-			var segs = [];
-			if (itemEnc) segs.push('item=' + itemEnc);
-			segs.push('needShowMore=' + encodeURIComponent(nsmOut));
-			segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
-			segs.push('fromShareDynamic=1');
-			var packed = path + '?' + segs.join('&');
-			if (packed.length <= 1024) return packed;
+			var compactQs = buildShareDynamicLaunchSegs({ compact: true }).join('&');
+			var compactPage = compactQs ? path + '?' + compactQs : path;
+			if (compactPage.length <= 1024) return compactPage;
 
 
-			var blob = parseShareDynamicItemBlob();
+			var meta = resolveShareDynamicLaunchMeta();
 			var mini = new URLSearchParams();
 			var mini = new URLSearchParams();
-			if (blob && blob.id != null && String(blob.id).trim() !== '') {
-				var did = String(blob.id).trim();
-				mini.set('dynamicId', did);
-				mini.set('sourceId', did);
-			}
-			var st =
-				getMergedParam('sourceType') ||
-				getMergedParam('type') ||
-				(blob && blob.type != null ? String(blob.type) : '');
-			if (st) mini.set('sourceType', st);
-			mini.set('needShowMore', nsmOut);
-			mini.set('fromHomeFeed', fhfOut);
+			if (meta.sourceId) {
+				mini.set('sourceId', meta.sourceId);
+				mini.set('dynamicId', meta.sourceId);
+			}
+			if (meta.sourceType) mini.set('sourceType', meta.sourceType);
+			if (meta.userId) mini.set('userId', meta.userId);
+			mini.set('needShowMore', 'true');
+			mini.set('fromHomeFeed', '0');
 			mini.set('fromShareDynamic', '1');
 			mini.set('fromShareDynamic', '1');
 			var shortPage = path + '?' + mini.toString();
 			var shortPage = path + '?' + mini.toString();
-			if (shortPage.length <= 1024) return shortPage;
-			return shortPage.slice(0, 1024);
+			return shortPage.length <= 1024 ? shortPage : shortPage.slice(0, 1024);
 		}
 		}
 
 
 		function buildAppDeepLink() {
 		function buildAppDeepLink() {