解决ios下的微信打开的页面背景音乐无法自动播放

标签:

后面的项目发现,还有两个坑,需要注意下:

·本文的解决方案的核心是利用了 微信/易信 在ready的时候会有个 WeixinJSBridgeReady/YixinJSBridgeReady事件,通过监听这个事件来触发的。那有个坑就是 如果微信已经ready了,但还没执行到你监听这个ready事件的代码,那么你的监听是没用的,所以最理想的情况是,监听的js放在head前面(放在css外链之前),确保最新执行,切记!切记!。

·另一个坑就是,本文的解决方案只适合一开始就播放的背景音乐。如果你是做那种微信场景(打开页面模拟收到很多条微信,每条微信都要播放那段音效),实际上本文的解决方案是不行的。因为ready的事件只会执行一次,即使你在ready事件里面用setTimeout或者setInterval也可能会导致丢失情况。

-----------------------------------------------------------

前言

在做各种HTML5场景页面的时候,插入背景音乐是一个很普遍的需求。我们都知道,IOS下的safari是无法自动播放音乐的,以至一直以来造成一种错误的认识,iso是无法自动播放媒体资源的。直到微信火爆起来,我们发现IOS的微信里面打开的页面却可以实现自动播放。这种情况颠覆了我之前的认知。但是,但是。。。最近的项目,又发现了一个头疼的问题。部分的IOS微信,打开有自动播放背景音乐的页面没有声音!!最头疼的是同款机子,相同的IOS系统,相同的微信版本!!没错,前端就是要经常这么折腾的,同一个问题,你以为找到了最终的解决方案,但是各种浏览器更新快速,昨天没问题,也许今天就有问题了。还好,这个问题暂时找到原因了,详情请看下文。

解决方案

先看下平时使用audio标签插入背景音乐的代码:

< audio  id = "Jaudio"  class = "media-audio"  src = "http://game.163.com/weixin/gfxm3_gc/images/bg.mp3"  autoplay preload  loop = "loop" ></ audio  >

正常来说,上面的写法在安卓和大部分IOS机子的微信是可以播放的(safari这里就忽略讨论),可以扫一扫demo测试下你的手机:

技术分享

如果上面的demo,你的ios微信可以播放,说明你的是大部分正常的手机。如果不能播放,哈哈,你成为了少部分不能正常播放的幸运者。。。

那代码有办法解决这少部分用户呢?如何解决呢?

答案的关键就是微信的WeixinJSBridgeReady事件。这个是微信自带提供的事件,测试发现,上面说的少部分的机子微信只要做微信ready后执行播放,就可以用代码实现自动播放功能了!具体代码请看下面:

< audio  id = "Jaudio"  class = "media-audio"  src = "http://game.163.com/weixin/gfxm3_gc/images/bg.mp3"  preload  loop = "loop" ></ audio  >
function  audioAutoPlay(id){
     var  audio = document.getElementById(id);
     audio.play();
     document.addEventListener( "WeixinJSBridgeReady" function  () {
             audio.play();
     },  false );
}
audioAutoPlay( ‘Jaudio‘ );

刚才如果你第一个demo不能播放的童鞋可以再扫一扫测试下(如果第一个demo已经测试正常的,这个肯定是正常的啦)

技术分享

是不是听到声音了呢?!!解决方案就是这么简单。

后语

总结下吧,关于音乐自动播放的问题,现在可以分为三种:

1-支持audio的autoplay,大部分安卓机子的自带浏览器和微信,大部分的IOS微信(无需特殊解决)

2-不支持audio的autoplay,部分的IOS微信(本文提供的解决方案)

3-不支持audio的autoplay,部分的安卓机子的自带浏览器(比如小米,开始模仿safari)和全部的ios safari(这种只能做用户触屏时就触发播放了)

那么针对已知的三种情况,关于自动播放背景音乐的问题,我们来总结一下综合解决方案代码吧:

< audio  id = "Jaudio"  class = "media-audio"  src = "http://game.163.com/weixin/gfxm3_gc/images/bg.mp3"  preload  loop = "loop" ></ audio  >
function  audioAutoPlay(id){
     var  audio = document.getElementById(id),
         play =  function (){
         audio.play();
         document.removeEventListener( "touchstart" ,play,  false );
     };
     audio.play();
     document.addEventListener( "WeixinJSBridgeReady" function  () { //微信
        play();
     },  false );
     document.addEventListener( ‘YixinJSBridgeReady‘ function () { //易信
               play();
         },  false );
     document.addEventListener( "touchstart" ,play,  false );
}
audioAutoPlay( ‘Jaudio‘ );

技术分享

文章转载来自:http://www.mamicode.com/info-detail-1505268.html

<think>我们正在讨论的是在iOSSafari浏览器中实现微信支付的功能。用户的问题集中在实现方式和功能解释上。根据提供的引用,我们可以总结出以下几点关键信息:1.**问题背景**:在iOS微信内置浏览器中,使用H5支付后无法直接返回APP。这是因为微信H5支付默认通过`redirect_url`参数控制支付后跳转,但iOS的沙盒机制会强制在Safari中打开该URL(引用[1])。2.**解决方案**:使用**UniversalLinks**技术可以绕过这个限制,实现从微信直接返回APP(引用[1])。UniversalLinks是苹果提供的一种机制,允许应用通过关联的网站域名直接打开应用,而无需用户确认跳转,并且支持HTTPS安全校验。3.**H5支付的定义**:微信H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户确认支付后,页面会呼起微信客户端进行支付(引用[2])。它主要用于触屏版的手机浏览器请求微信支付的场景。需要注意的是,H5支付不建议在APP端使用,在APP中应使用微信APP支付(引用[2])。4.**实现步骤**:引用[1]提到需要配置UniversalLinks。具体步骤包括:-在苹果开发者后台为APP配置AssociatedDomains(关联域名)。-在服务器上配置一个特定的apple-app-site-association文件,用于声明该域名支持打开哪些APP。-在微信支付请求的`redirect_url`参数中,使用配置了UniversalLinks的域名下的URL。5.**回调URL的构造**:引用[4]给出了一个微信支付请求的URL示例:```https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn```其中,`redirect_url`参数需要是经过URL编码的,并且这个URL必须是配置了UniversalLinks的域名下的URL。6.**微信登录的参考**:引用[3]提到iOS应用接入微信登录的步骤,虽然主题不同,但配置方法类似(如注册应用、配置URLScheme等),可以作为参考。现在,我们根据以上信息来组织回答。###回答结构:1.**功能解释**:先解释在iOSSafari中微信支付的工作流程和遇到的问题。2.**解决方案**:重点介绍UniversalLinks的原理和实现步骤。3.**具体实现**:给出关键步骤和注意事项。4.**注意事项**:包括H5支付在APP中使用的限制等。同时,生成相关问题。注意:引用标识要自然地添加在相关段落的末尾。</think>### iOS Safari 微信支付功能及实现方式详解 #### 一、功能解释(通俗版) 想象你在手机浏览器(如 Safari)购物: 1. **支付触发**:点击"微信支付"按钮 → 自动唤起微信 APP 2. **支付流程**:在微信内完成密码/指纹验证付款 3. **返回问题**:支付后本应自动返回购物页面,但 iOS 系统会强制跳转到 Safari 而非原页面(就像快递员把包裹送错地址)[^1] 核心功能是**在浏览器中无缝调用微信支付并正确返回**,但 iOS 的特殊机制会导致"迷路"问题。 #### 二、实现方式(技术方案) 通过 **Universal Links(通用链接)** 解决返回问题: ##### 关键步骤 1. **配置通用链接**(核心) - 在苹果开发者后台注册你的域名 - 服务器部署 `apple-app-site-association` 文件(相当于"地址匹配规则") ```json { "applinks": { "apps": [], "details": [{ "appID": "TeamID.com.your.app", "paths": ["/pay-return/*"] }] } } ``` 2. **构造支付链接**(需包含两个参数) ```bash https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb? prepay_id=wx2023xxxxxx & # 微信生成的支付ID redirect_url=https://yourdomain.com/pay-return # 通用链接地址[^4] ``` 3. **iOS 应用配置** - Xcode 开启 `Associated Domains` 能力 - 添加域名:`applinks:yourdomain.com` ##### 为何有效? - ✅ **绕过沙盒限制**:通用链接被 iOS 视为"安全路径",允许直接跳回 APP - ✅ **无需用户确认**:比传统 URL Scheme 更流畅[^1] - ✅ **支持 HTTPS**:符合苹果安全要求 #### 三、注意事项 1. **禁止在 APP 内使用** H5 支付专为浏览器设计,APP 内应使用[微信 APP 支付](https://pay.weixin.qq.com)[^2] 2. **域名必须 HTTPS** 苹果强制要求加密传输 3. **路径精确匹配** `paths` 配置需与 `redirect_url` 子路径一致 4. **微信白名单** 需在微信开放平台登记支付域名 > ⚠️ 错误示例:未使用通用链接时,iOS 用户支付后会被困在 Safari 空白页 #### 四、完整流程示意图 ```mermaid graph LR A[Safari 发起支付] --> B(唤起微信APP支付) B --> C{支付成功} C -->|Universal Links| D[自动跳回原APP] C -->|普通URL| E[滞留Safari] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值