uniapp 微信自动播放背景音乐插件

前言

现在不管是 audio 还是 video(带音频) 都没办法做自动播放,受到浏览器阻止自动播放策略的约束;

还好微信内置浏览器拥有一些特殊api,可以实现自动播放。闲话少说直接看效果

👇🏻👇🏻👇🏻 插件地址 | 效果演示 👇🏻👇🏻👇🏻
https://ext.dcloud.net.cn/plugin?id=20174

思路

其实 iOS 实现起来比较简单,只需要监听 WeixinJSBridgeReady 或者 weixin. ready 就可以正常播放 audio 元素的音频;

Android 实现起来相对麻烦一点,需要借助 soundjs 库来完成。这里我参考借鉴 superzdd 大佬的实验 wechat-h5-backgound-music-survey,有兴趣的可以去了解一下~

这里面比较麻烦的一个事情是。。。。 iOS 方案和 Android 方案相互是不兼容的!

成品插件

所以我把他封装成了一个 jssdk 插件,可以快速使用并且完美兼容 微信Android 和 iOS 以及一般手机浏览器 (触摸)

好省去一些时间浪费在做兼容这件事上,有兴趣的欢迎前来使用~ 并且项目长期维护

欢迎提交意见和建议,我将持续改进

插件地址:https://ext.dcloud.net.cn/plugin?id=20174

### 实现 UniApp微信小程序自定义分享功能 #### 配置 `pages.json` 文件中的分享设置 为了使每个页面都能拥有独立的分享配置,在项目的 `pages.json` 文件中可以为特定页面指定默认的分享参数: ```json { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页" }, "onShareAppMessage": { "title": "欢迎来到我们的小程序!", "path": "/pages/index/index?from=share", "imageUrl": "http://example.com/share-image.png" } } ``` 此部分设定适用于该页面的一般情况下的转发行为[^1]。 #### 使用 Vue 全局混入来简化全局分享逻辑 对于希望在整个应用范围内统一处理分享逻辑的情况,可以通过创建一个全局混入的方式来进行操作。这允许开发者在一个地方集中管理所有页面共享的行为模式而无需重复编码。 ```javascript // main.js 或者其他初始化入口文件内加入如下代码片段 import Vue from 'vue'; Vue.mixin({ onShareAppMessage() { return { title: this.$t('default_share_title'), // 假设使用国际化插件获取标题文案 path: `/pages/${this.route}?ref=${encodeURIComponent(this.userId || '')}`, // 动态拼接跳转路径并附带推荐人ID等信息 imageUrl: `${process.env.VUE_APP_API_URL}/api/get-share-thumbnail`, // API接口动态生成缩略图链接 }; } }); ``` 上述做法使得任何未单独重写 `onShareAppMessage` 方法的页面都会自动采用这套默认规则进行消息传递。 #### 页面级覆盖全局分享配置 当某个具体页面需要提供不同于全局默认值的服务时,则可以在对应组件内部重新定义 `onShareAppMessage()` 函数以实现个性化定制化服务。例如在商品详情页根据实际产品特性调整分享内容: ```html <template> <!-- 商品详情模板 --> </template> <script> export default { data () { return { productInfo: null, } }, onLoad(options) { // 加载商品数据... }, methods: { async fetchProductDetails(productId) { try { const response = await uni.request({ url: '/product/' + productId, method: 'GET' }); this.productInfo = response.data; } catch(error){ console.error('Failed to load product details:', error); } } }, onShareAppMessage() { if (!this.productInfo) return; let shareData = { title: `${this.productInfo.name} - 特价仅售 ${this.productInfo.price}`, path: `/pages/product-detail?id=${this.productInfo.id}` }; if (this.productInfo.mainImage) { shareData.imageUrl = this.productInfo.mainImage.url; } return shareData; } }; </script> ``` 这段脚本展示了如何基于当前显示的商品信息构建独特的分享卡片,包括但不限于修改标题文字、目标URL以及附加一张代表性的图像作为封面展示给接收方查看[^2]。 #### 利用 Canvas 绘制复杂图形作为分享素材 如果应用程序中有更复杂的视觉需求——比如想要把多个元素组合成单一画面用于社交平台传播的话,那么就可以考虑借助 HTML5 `<canvas>` 标签的强大绘图能力完成这项工作。通过 JavaScript 控制绘制过程能够灵活地适应不同业务场景的要求。 ```css /* 将 canvas 移出可视区域 */ .hideCanvasView { position: absolute !important; width: 0px !important; height: 0px !important; } .shareCanvas { display:none; } ``` ```html <!-- 在页面结构中预留位置供后续渲染 --> <div class="hideCanvasView"> <canvas id="customShareCard" style="width:750rpx;height:800rpx;"></canvas> </div> ``` ```javascript methods: { generateCustomShareImage() { const ctx = uni.createCanvasContext('customShareCard'); // 设置背景颜色或其他样式属性 ctx.setFillStyle('#ffffff'); ctx.fillRect(0, 0, 750, 800); // 添加文本描述 ctx.setFontSize(36); ctx.setTextAlign('center'); ctx.fillText(`限时优惠!`, 375, 100); // 插入图片资源 ctx.drawImage('/static/images/logo.png', 100, 200, 550, 300); // ... 更多绘画指令 ... // 发起绘制命令并将结果保存至临时存储区以便下一步调用 ctx.draw(true, () => { setTimeout(() => { uni.canvasToTempFilePath({ x: 0, y: 0, width: 750, height: 800, destWidth: 750 * 2, destHeight: 800 * 2, canvasId: 'customShareCard', success: ({ tempFilePath }) => { // 更新状态或触发事件通知外部更新分享配置里的 imageUrl 字段指向新生成的文件路径 this.generatedImageUrl = tempFilePath; } }) }, 20) }); } }, watch: { generatedImageUrl(newValue) { if (newValue && typeof newValue === 'string') { Object.assign(this.onShareAppMessage(), { imageUrl: newValue }); } } } ``` 这里介绍了一种利用 Canvas 创建合成图像的方法,并将其转换为可被分享使用的静态资源形式。这种方式特别适合那些希望通过编程手段控制最终呈现效果的应用场合[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值