更新记录

v1.0.2022.12.13(2022-12-14)

2022-12-12

修复iOS 普通下载header的bug。

v1.0.2022.12.12(2022-12-12)

2022-12-12

新增iOS下载header头

v1.0.2021.09.30(2021-09-30)

2021-09-30

1、在iOS上实现m3u8下载和播放功能。

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 11.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:9 - 14

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


介绍

多任务下载管理,可以通知下载多个任务分别进行管理。

接口说明

  • init() 接口初始化,页面内只需调用一次

  • createDownloadTask() 创建一条新的下载任务

  • createM3U8Task() 创建一条m3u8下载任务【新接口,双端支持】

  • play() 开启本地m3u8播放服务【新接口,双端支持】

  • close() 关闭播放本地m3u8播放服务【新接口,双端支持】

  • queryAll() 查询所有下载任务,返回下载列表

  • pauseAll() 暂停所有下载任务

  • listener() 开始监听下载任务,返回各任务的下载状态及进度,回调周期1秒1条

  • stopListener() 停止监听下载任务

  • deleteAll() 删除全部下载任务,参数1:是否同时删除下载的文件

  • deleteById() 根据id删除一个任务,参数1:任务id 参数2:是否同时删除文件 参数3:要删除的文件名; 若参数2为true,则参数3必填

  • pauseById() 根据id暂停一个任务,参数1:任务id

  • resumeById() 根据id恢复一个任务,参数1:任务id

  • cancelById() 根据id取消一个任务,参数1:任务id

状态 说明 适用范围
IDLE 空闲 Android、iOS
WAITING 等待 Android、iOS
CONNECTING 连接 Android
CONNECT_SUCCESSFUL 连接成功 Android
DOWNLOADING 正在下载 Android、iOS
PAUSED 暂停 Android、iOS
CANCELLED 取消 Android
COMPLETED 完成 Android、iOS
ERROR 发生错误 Android、iOS

用法Demo

<template>
    <div>
        <view class="uni-list-cell-db">
            <picker @change="bindPickerChange" :value="index" :range="info" :range-key="'saveName'">
                <view class="uni-input">{{info[index].saveName}}</view>
            </picker>
        </view>
        <view style="margin-top: 50px;">
            <button @click="start">创建下载</button>
        </view>
        <view>
            <button @click="m3u8">创建M3U8下载</button>
        </view>
        <view>
            <button @click="queryAll">查询下载列表</button>
        </view>
        <view>
            <button @click="recoverAll">开始所有下载</button>
        </view>
        <view>
            <button @click="pauseAll">暂停所有下载</button>
        </view>
        <view>
            <button @click="listener">开始监听</button>
        </view>
        <view>
            <button @click="stopListener">停止监听</button>
        </view>
        <view>
            <button @click="deleteAll">删除全部</button>
        </view>
        <view v-for="(item,index) in downloadList" :key="index">
            <text>{{item.save_name}}</text>
            <text>{{item.status}}</text>
            <text>{{item.current_size}}/{{item.total_size}}</text>
            <progress :percent="item.percent*100" :active="false" stroke-width="3" />
            <button type="primary" @click="pauseById(item.id)">暂停</button>
            <button type="primary" @click="resumeById(item.id)">恢复</button>
            <button type="primary" @click="cancelById(item.id)">取消</button>
            <button type="primary" @click="deleteById(item.id)">删除</button>
            <button type="primary" @click="play(item.id)">播放</button>
        </view>
    </div>
</template>

<script>
    // 首先需要通过 uni.requireNativePlugin("ModuleName") 获取 module 
    const DownloaderManager = uni.requireNativePlugin('XM-DownloaderManager');

    export default {
        data() {
            return {
                downUrl: "http://dldir1.qq.com/weixin/android/weixin708android1540.apk",
                saveName: "微信.apk",
                downloadList: [],
                info: [{
                        downUrl: "http://50069.gzc.svp.tencent-cloud.com/gzc_1000035_0b5334cqeaafc4aihmlm6zqjbx6dalpqkasa.f0.mp4",
                        saveName: "微信.mp4",
                    },
                    {
                        downUrl: "http://50069.gzc.svp.tencent-cloud.com/gzc_1000035_0bc3xyb7qaadoeapb6tebrqjnpwd7c7ah6ca.f0.mp4",
                        saveName: "百度网盘.mp4",
                    },
                    {
                        downUrl: "https://video.hainaxueyuan.com/sv/174a2ac2-17727ba1f96/174a2ac2-17727ba1f96.mp4",
                        saveName: "174a2ac2-17727ba1f96.mp4",
                    },
                    {
                        downUrl: "https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe",
                        saveName: "微信.exe",
                    },
                    {
                        downUrl: "https://qd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk",
                        saveName: "qq.apk",
                    }
                ],
                index: 0,
                isListener: false,
                taskList: [],
                taskIdList: [],
                taskStart: false
            }
        },
        onReady() {
            var _this = this;
            DownloaderManager.init({
                maxDownloadTasks: 3, // 最大同时下载任务数,iOS最大为5
                downloadDir: '/storage/emulated/0/插件下载', // 下载文件路径
                maxDownloadThreads: 3, // 最大下载线程数
                autoRecovery: false, // 是否自动恢复下载
                openRetry: true, // 下载失败是否打开重试
                maxRetryCount: 2, // 重试次数
                retryIntervalMillis: 1000, // 每次重试时间间隔(毫秒)
                allowCellular: true, //iOS允许蜂窝网络下载
                iOS_Dir: '' //加上之后文件存在Documents/Pandora/APPID/doc文件夹中,不加则继续存在Cache中,【加上Document后新版奔溃,请先不要使用】
            }, function(res) {
                console.log(res)
                if (res.success) {
                    uni.showToast({
                        title: res.errMsg,
                        icon: "none"
                    })
                    // 显示下载列表
                    _this.queryAll();
                    _this.listener();
                }
            });
        },
        methods: {
            bindPickerChange(e) {
                this.downUrl = this.info[e.target.value].downUrl;
                this.saveName = this.info[e.target.value].saveName;
                this.index = e.target.value;
            },
            start() {
                var _this = this;
                // 文件保存目录,应用目录下的cache/quietDownload/this.saveName
                DownloaderManager.createDownloadTask({
                    downUrl: this.info[this.index].downUrl,
                    saveName: this.info[this.index].saveName // 此处可改成根据下载地址自动获取文件名及文件格式
                }, function(res) {
                    console.log(res)
                    if (res.success) {
                        _this.listener();
                    }
                });
                this.index++;
            },
            queryAll() {
                var _this = this;
                DownloaderManager.queryAll(function(res) {
                    console.log(res)

                    if (res['success']) {
                        _this.index = res.data.length;
                        _this.downloadList = res.data;
                    } else {
                        _this.index = 0;
                        _this.downloadList = [];
                    }

                });
            },
            recoverAll() {
                DownloaderManager.recoverAll();
                this.queryAll();
            },
            pauseAll() {
                DownloaderManager.pauseAll();
                this.queryAll();
            },
            listener() {
                var _this = this;
                console.log('开始监听')
                if (!_this.isListener) {
                    console.log('进入设置监听')
                    // 如果有正在进行中的下载任务,此方法将返回下载中的任务信息
                    // 回调频率为 1秒
                    DownloaderManager.listener(function(res) {
                        console.log('进度回调:' + JSON.stringify(res))
                        _this.isListener = true;
                        if (res['success']) {
                            let _index = _this.downloadList.findIndex(i => i['id'] === res['data']['id'])
                            if (_index > -1) {
                                _this.downloadList[_index] = res['data']
                            } else {
                                _this.downloadList.push(res['data'])
                            }
                            _this.downloadList = [..._this.downloadList]
                        }
                    });
                }
            },
            stopListener() {
                console.log('停止监听')
                this.isListener = false;
                DownloaderManager.stopListener();
            },
            deleteAll() {
                // 删除之前若有任务在进行中,请先暂停全部任务再进行删除操作
                DownloaderManager.deleteAll(true);
                this.queryAll();
                this.taskList = [];
                this.taskIdList = [];
                this.taskStart = false;
            },
            deleteById(id) {
                // 删除之前若任务在进行中,请先暂停任务再进行删除操作
                // deleteById 参数1:任务id 参数2:是否同时删除文件 参数3:要删除的文件名
                DownloaderManager.deleteById(id);
                this.queryAll();
            },
            pauseById(id) {
                DownloaderManager.pauseById(id);
                this.queryAll();
            },
            resumeById(id) {
                DownloaderManager.resumeById(id);
                this.queryAll();
            },
            cancelById(id) {
                DownloaderManager.cancelById(id);
                this.queryAll();
            },
            m3u8() {
                var _this = this;
                // 文件保存目录,应用目录下的cache/quietDownload/this.saveName
                DownloaderManager.createM3U8Task({
                    downUrl: 'https://v3.szjal.cn/20191211/gH5Fjg92/900kb/hls/index.m3u8',
                    saveName: '123456' // 此处可改成根据下载地址自动获取文件名及文件格式
                }, function(res) {
                    console.log(res)
                    if (res.success) {
                        _this.listener();
                    }
                });
            },
            play(url) {
                uni.navigateTo({
                    url: '../sample/Splayer?src='+url
                });
            }
        }
    }
</script>

后续版本计划

  • 优化iOS m3u8下载逻辑。

  • 增加M3U8边缓存边播放。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

网络、存储

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问