ios 使用window.location.href 不能跳转微信短链处理过程以及解决方法

2024-06-04 9722阅读

需求背景:

        由h5提供页面,通过后台请求微信api生成对应的schemal短链,该h5页面嵌入到原生的ios以及安卓app上,当用户点击后通过短连接跳转到其他小程序中

以下为生成微信scheme代码示例,生成后短链为:weixin://dl/business/?t=l97aMn7aZF 这种

 /**
     *  生成短连接
     * @param data
     * @return
     */
    public static String getUrlScheme(JSONObject data) {
        try {
            log.info("==>获取小程序跳转地址,mchnt:{}", data);
            String appId = data.getString("appId");
            String secret = data.getString("secret");
            String accessToken = getAccessToken(appId, secret);
            return generateWechatScheme(accessToken, data);
        } catch (Exception e) {
            log.error("==>获取小程序跳转地址失败", e);
            throw new FuiouException("5022","获取小程序跳转地址失败");
        }
    }
    /**
     * 向微信服务端请求生成小程序 scheme
     */
    public static String generateWechatScheme(String accessToken, JSONObject data) {
        CloseableHttpClient client = HttpClientUtil.createClient();
        String url = "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + accessToken;
        HttpPost request = new HttpPost(url);
        request.setHeader("Content-Type", "application/json; charset=utf-8");
        String path = data.get("path").toString();
        String queryStr = data.get("queryStr").toString();
        String env_version = data.get("env_version").toString();
        // 构建请求体 JSON
        String requestBody = "{\"jump_wxa\":{\"path\":\"" + path + "\",\"query\":\"" + queryStr
                + "\",\"env_version\":\"" + env_version
                + "\"},\"is_expire\":false,\"expire_type\":1,\"expire_interval\":" + 1 + "}";
        request.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8));
        log.info("==>调用微信generatescheme接口,request body:" + requestBody);
        String response = HttpClientUtil.executeAndClose(client, request);
        log.info("==>调用微信generatescheme接口,response:" + response);
        JSONObject jsResp = JSONObject.parseObject(response);
        String openlink = jsResp.getString("openlink");
        log.info("==>获取到的微信小程序scheme:" + openlink);
        return openlink;
    }
    /**
     * 获取 access_token
     */
    private static String getAccessToken(String appId, String secret) {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
        CloseableHttpClient client = HttpClientUtil.createClient();
        HttpGet request = new HttpGet(url);
        String response = HttpClientUtil.executeAndClose(client, request);
        log.info("==>获取微信accessToken,response:" + response);
        JSONObject jsResp = JSONObject.parseObject(response);
        String accessToken = jsResp.getString("access_token");
        return accessToken;
    }

所遇到问题:

        短链如:weixin://dl/business/?t=l97aMn7aZF

        通过短链在前端利用js  window.location.href = weixin://dl/business/?t=l97aMn7aZF 进行跳转,在安卓上面能正常跳转,但是ios无法跳转,且没有反应

解决问题思路

        1、检查schema 是否正确,在ios真机测试也是可以跳;排除

        2、将window.location.href 替换为 window.location  以及换为 windos.open(xx) 等多种方式均不可行;

       3、怀疑是h5页面的meta 写的有问题,随即替换为meta 信息,进行测试,还是不行;

       4、本来都准备放弃,让ios提供一个原生方法,自己这边判断如果是ios就调用原生方法进行跳转,附一段js ios 判断代码

function isIos(){
    var u = window.navigator.userAgent;
    var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
    return     isiOS;
}

       5、这时候经同事提醒,将链接放到其他页面,看是否可跳转,然后将链接放到首页测试是否可以跳转,这时候神奇的事情发生了,竟然ios 能正常跳了,同样是 window.location.href 

     6、拿到h5页面开始分析首页和2级页面的区别,发现首页没有无层级关系,而二级目录有一个ifream页面,以下为二级页面

ios 使用window.location.href 不能跳转微信短链处理过程以及解决方法 第1张

    

最终解决方案

        经过以上分析后得知,window.location.href 不能跳出父框架,因为需要唤起小程序,所以需要跳出ifream ,但是安卓没问题,可能是语法的限制,最终知道解决方案

window.top.location.href = xx 微信的短链     及可正常跳转

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]