c语言编程笔录

首页 >   > 笔记大全

笔记大全

uniapp分享链接后打不开如何办

更新时间:2024-01-03

问题背景

在一定条件下,uniapp分享出去的链接在点击时会无法打开,怎么去解决这个问题呢?我们需要分析一下这个问题。

问题分析

Uniapp提供了分享接口可以分享到微信、QQ、微博等平台,但是因为每个平台对链接的要求不尽相同,可能会出现一些兼容性问题,其中最常见的问题就是分享出去的链接无法打开。

这种情况一般有以下几个原因:

  1. 分享的链接必须是合法的URL地址
  2. 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);  
    }
  3. 链接包含敏感字符
  4. 因为一些平台对链接的识别规则不同,所以可能会将链接中包含敏感字符的链接识别为非法的链接,导致无法打开。比如,微信就对包含特定域名的链接做了限制,导致分享出去的链接无法打开。

  5. 分享的链接可能会被篡改
  6. 因为网络的不确定性,分享出去的链接极有可能会被黑客篡改,进而导致无法打开,这种情况下我们需要引入一些机制来检测链接是否被篡改。

解决方案

下面,我们来提供几种常用的解决方案:

  1. 检测分享的链接是否符合要求
  2. 在分享的时候,我们可以预先检测链接是否符合要求,如果发现有异常就进行相应的提示。常见的方法就是用正则表达式检测链接是否为合法的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('分享链接无效,请重新分享!');
    }
  3. 对于包含特定域名的链接,利用参数传递方式跳转到第三方应用内部处理
  4. 当分享的链接包含微信等特定域名时,我们需要引导用户通过其他方式进入链接,例如利用参数传递方式跳到第三方应用中去处理链接。比如,我们可以在需要发布的链接中添加特定的参数,然后在处理页面监听参数并进行相应处理,从而达到跳转的目的,跳转到第三方应用中去处理链接。

    以下是一个处理参数传递的示例代码:

    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;
        }
        // 处理链接
        ...
    }
  5. 引入链接篡改检测机制
  6. 为了防止黑客篡改分享的链接,我们可以在链接中加入一些签名或者口令。这些签名和口令只有原始链接的制作者才知道,其他人无法伪造。在跳转到指定页面时,我们需要检测签名或者口令是否匹配,如果匹配则跳转到正常的页面,否则则提示用户链接无效。

    例如,先将内容用密钥签名,然后将签名附加到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开发程序时,分享出去的链接无法打开是一件非常严重的问题。我们可以通过检测分享链接是否符合规范、增加特定参数传递跳转、加入签名等机制来避免分享链接无法打开的问题。

必要时可以引入第三方的分享平台,它们更了解自身平台的细节,尤其是对链接识别的细节,这样能够更好的解决我们分享出去的链接无法打开的问题。