记录常见的问题:encodeURICompnent 解码过程中出现空格 以及 第三方app中使用schema 唤起app

  • window.location.href跳转的时候使用了encodeURIComponent编码了部分参数,但是在第三方app中出现了编码过后的参数换行和空格的情况(部分第三方应用或者java程序)

    代码如下

    const domain = this.app.isProd()?"https://xfkh.foundersc.com/":'https://kaihu-dev-cstest.fzzqxf.com/'
    			
    window.location.href = domain + "api/result/resultDesc?token=" + encodeURIComponent(this.app.getToken());
    
      **解决方案**
    
      在`encodeURIComponent(this.app.getToken())`外面再包一层`encodeURIComponent`
    
      全部代码如下:
    
const domain = this.app.isProd()?"https://xfkh.foundersc.com/":'https://kaihu-dev-cstest.fzzqxf.com/'
window.location.href = domain + "api/result/resultDesc?token=" + encodeURIComponent(encodeURIComponent(this.app.getToken()));
	** 原理查看**

		1.猜测是跳转过程中	`token` 内部含有`+`号,在报文传递的时候`+`号会自动变成空格,所以再次使用`encodeURIComponent`进行二次编码,将`+`号转换成`%20F`这样的十六进制编码的unicode字符,这样报文在后端拿到的时候就不会出现`空格`

		2.但是我很好奇,为什么第一次转码的时候还能有`+`号剩余,明明我第一次就用了`encodeURIComponent`这个步骤,为何还会出现`+`号,而且为什么+号在服务端拿到的时候就变成了`空格`,两个编码/解码方式不一样吗 `#todo`

		3.使用`encodeURICompnent`的原因,由于在url请求过程中为了防止`参数中携带一些歧义字符,比如传参的?号或者并列符号&甚至是等号`或者是为了避免在`url访问过程中非ascill编码字符在请求过程中的转码编码差异`所以在传输特殊字符或者非`asscill`编码字符的时候需要使用`encodeURIComponent`这个方法将参数编码,但是一般发生在`get`中比较多,因为`get`请求的参数是直接携带在`url`上面表示,而使用`post`请求参数可以以`报文`的形式进行传递,就可以避免这个问题

		4.至于服务端或者第三方应用为什么会把`+`转义成`空格`:服务端在拿到`url`参数的时候也会进行`decode`这个过程中`+`号会被decode成`空格`???还是有点强行解释



  • 第三方浏览器无法用schema唤起app以及schema到底是个啥

    在移动端浏览器中通过schema协议唤起app,schema就是一个类似http的页面跳转协议,andriodios都支持该协议,但支持该协议需要浏览器进行一定的规则设置,部分第三方浏览器没有实现或者限制了这个schema的跳转能力

    schema协议和http协议的规则类似,是一种页面之间的跳转协议,不仅适用于app之间跳转也适用于h5跳转app

    这种通过 scheme 打开本地应用的方式并不是所有浏览器都支持,尤其是在微信浏览器中是不支持使用 scheme 打开应用的,除非微信官方添加了白名单。QQ浏览器中倒是支持。

而且一些浏览器会询问用户是否打开,而另外一些则直接打开应用。

一般的做法是,判断当前浏览器是否为微信,如果是微信的话,则弹出一个遮罩层,提示用户使用其他浏览器打开。

还有就是在微信浏览器中使用应用宝的微下载,将当前页面重定向到应用宝的下载页面,不过这种方式的转化率很低。

有一个好消息是,在IOS9.0以上的系统中,可以使用 universal links 打开本地应用,不过Android不支持。

另外一个备选方案是,在微信浏览器中,使用iframe的方式打开一个包体地址(.apk结尾的url)进行下载时,会拉起一个选择框,让你选择打开的应用。不过这种方式对于某些域名无效,对于一些特殊的下载文件无效,如不能下载.rar的文件。而且对于已经安装了应用的用户来说,用户体验也不好。

使用这种技术的同时,考虑到其不确定性,应该做好备选方案。充分考虑到该页面的用户群体是否主要为新用户,以及访问的浏览器分布,从而制定相应的对用户来说比较友好的引导和备选方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app可以通过尝试唤起app来实现与原生app的交互。具体的实现方式取决于不同的平台和环境。 在iOS平台上,需要在Xcode进行配置,添加一个白名单,以允许其他应用程序通过URL Scheme来唤起你的uni-app。这样,当其他应用程序尝试通过URL Scheme打开你的uni-app时,系统会自动将控制权转移到你的应用程序。 在Android平台上,可以使用intent来唤起其他应用程序。你可以使用uni-app提供的API uni.navigateToMiniProgram() 或 uni.navigateTo() 来实现跳转到其他应用程序。 需要注意的是,由于微信屏蔽了schema协议,所以在微信内部无法直接通过URL Scheme来唤起其他应用程序。在这种情况下,可以通过引导用户点击按钮或链接,然后跳转到应用商店下载你的app。 以下是一个示例代码,演示如何在uni-app尝试唤起app: ```javascript // 尝试唤起app function openApp() { // 判断是否在微信内部 if (isWechat()) { // 在微信内部,引导用户下载app window.location.href = 'https://your-app-download-url'; } else { // 不在微信内部,尝试唤起app // 在这里根据不同的平台和环境使用不同的方法来唤起app // 例如,在iOS上可以使用window.location.href = 'your-app-url-scheme'; // 在Android上可以使用window.location.href = 'intent://your-app-url#Intent;scheme=your-app-scheme;package=your-app-package;end'; } } // 判断是否在微信内部 function isWechat() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; } } // 调用唤起app的函数 openApp(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值