uniapp分享链接后打不开如何办
更新时间:2024-01-03问题背景
在一定条件下,uniapp分享出去的链接在点击时会无法打开,怎么去解决这个问题呢?我们需要分析一下这个问题。
问题分析
Uniapp提供了分享接口可以分享到微信、QQ、微博等平台,但是因为每个平台对链接的要求不尽相同,可能会出现一些兼容性问题,其中最常见的问题就是分享出去的链接无法打开。
这种情况一般有以下几个原因:
- 分享的链接必须是合法的URL地址
- 链接包含敏感字符
- 分享的链接可能会被篡改
function isURL(strUrl) {
var strRegex = '^((https|http|ftp|rtsp|mms)?://)'
+ '?(([0-9a-zA-Z_!~*\'().&=+$%-]+: )?[0-9a-zA-Z_!~*\'().&=+$%-]+@)?' //ftp的user@
+ '(([0-9]{1,3}\.){3}[0-9]{1,3}'
+ '|'
+ '([0-9a-zA-Z_!~*\'()-]+\.)*' // 域名-
+ '([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z]\.' // 二级域名
+ '[a-zA-Z]{2,6})' // first level domain-
+ '(:[0-9]{1,4})?' // 端口-
+ '((/?)|' // a slash isn't required if there is no file name
+ '(/[0-9a-zA-Z_!~*\'().;?:@&=+$,%#-]+)+/?)$';
var re = new RegExp(strRegex);
return re.test(strUrl);
}
因为一些平台对链接的识别规则不同,所以可能会将链接中包含敏感字符的链接识别为非法的链接,导致无法打开。比如,微信就对包含特定域名的链接做了限制,导致分享出去的链接无法打开。
因为网络的不确定性,分享出去的链接极有可能会被黑客篡改,进而导致无法打开,这种情况下我们需要引入一些机制来检测链接是否被篡改。
解决方案
下面,我们来提供几种常用的解决方案:
- 检测分享的链接是否符合要求
- 对于包含特定域名的链接,利用参数传递方式跳转到第三方应用内部处理
- 引入链接篡改检测机制
在分享的时候,我们可以预先检测链接是否符合要求,如果发现有异常就进行相应的提示。常见的方法就是用正则表达式检测链接是否为合法的URL地址。
以下是一个检测链接合法性的示例代码:
function isURL(strUrl) {
// 正则表达式
var strRegex = '^((https|http|ftp|rtsp|mms)?://)'
+ '?(([0-9a-zA-Z_!~*\'().&=+$%-]+: )?[0-9a-zA-Z_!~*\'().&=+$%-]+@)?' //ftp的user@
+ '(([0-9]{1,3}\.){3}[0-9]{1,3}'
+ '|'
+ '([0-9a-zA-Z_!~*\'()-]+\.)*' // 域名-
+ '([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z]\.' // 二级域名
+ '[a-zA-Z]{2,6})' // first level domain-
+ '(:[0-9]{1,4})?' // 端口-
+ '((/?)|' // a slash isn't required if there is no file name
+ '(/[0-9a-zA-Z_!~*\'().;?:@&=+$,%#-]+)+/?)$';
var re = new RegExp(strRegex);
return re.test(strUrl);
}
// 检测
if (!isURL(url)) {
alert('分享链接无效,请重新分享!');
}
当分享的链接包含微信等特定域名时,我们需要引导用户通过其他方式进入链接,例如利用参数传递方式跳到第三方应用中去处理链接。比如,我们可以在需要发布的链接中添加特定的参数,然后在处理页面监听参数并进行相应处理,从而达到跳转的目的,跳转到第三方应用中去处理链接。
以下是一个处理参数传递的示例代码:mounted(){
// 获取路由参数
var url = this.$route.query.url;
// 正则表达式
var strRegex = '^((https|http|ftp|rtsp|mms)?://)'
+ '?(([0-9a-zA-Z_!~*\'().&=+$%-]+: )?[0-9a-zA-Z_!~*\'().&=+$%-]+@)?' //ftp的user@
+ '(([0-9]{1,3}\.){3}[0-9]{1,3}'
+ '|'
+ '([0-9a-zA-Z_!~*\'()-]+\.)*' // 域名-
+ '([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z]\.' // 二级域名
+ '[a-zA-Z]{2,6})' // first level domain-
+ '(:[0-9]{1,4})?' // 端口-
+ '((/?)|' // a slash isn't required if there is no file name
+ '(/[0-9a-zA-Z_!~*\'().;?:@&=+$,%#-]+)+/?)$';
var re = new RegExp(strRegex);
// 检测链接是否合法
if (!re.test(url)) {
alert('分享链接无效,请重新分享!');
return;
}
// 处理链接
...
}
为了防止黑客篡改分享的链接,我们可以在链接中加入一些签名或者口令。这些签名和口令只有原始链接的制作者才知道,其他人无法伪造。在跳转到指定页面时,我们需要检测签名或者口令是否匹配,如果匹配则跳转到正常的页面,否则则提示用户链接无效。
例如,先将内容用密钥签名,然后将签名附加到URL传递。在服务端收到这个URL时,将参数和密钥组合,进行签名,如果签名正确就说明链接没有被篡改。 以下是一个示例代码:function getHashCode(str) {
var h = 0,hashCharCode = function(str) {
var hash = 0;
if (str.length == 0) return hash;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
};
for(i=0;i>0;
}
return h;
}
function callNative(info) {
// 调用App公共核心组件接口,安卓用事件通知机制,iOS用参数传递
// 组织调用数据
var data = {'q':{'sq' : getHashCode(info['key'] + info['url']),'res': info['url']}};
// 关于AT,AT要通过Session共享,AT实现看下面
this.getSession().then(session => {
var digjs = {
"id": "sendEventToNativeWithResult",
"method": "sendEventToNativeWithResult",
"data": data,
"at": session.at
};
// 调用密钥签名
digjs['_tt'] = window.digest_sign(digjs, info['key']);
window.webkit.messageHandlers.WKWebView.postMessage(JSON.stringify(digjs));
});
}
总结
在编写uniapp开发程序时,分享出去的链接无法打开是一件非常严重的问题。我们可以通过检测分享链接是否符合规范、增加特定参数传递跳转、加入签名等机制来避免分享链接无法打开的问题。
必要时可以引入第三方的分享平台,它们更了解自身平台的细节,尤其是对链接识别的细节,这样能够更好的解决我们分享出去的链接无法打开的问题。