尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

影视APP双端源码二次开发:播放器内核、BaseUrl与签名上架全解析

影视APP双端源码二次开发:播放器内核、BaseUrl与签名上架全解析 简介这是一份影视双端源码程序适合移动应用开发者、产品运营人员及视频聚合类应用学习者。源码同时覆盖安卓与苹果两端整合在线播放、分销推广、卡密生成、会员等级与后台管理能帮助快速搭建影视平台理解跨平台开发、用户关系及虚拟商品交易等核心逻辑。压缩包为zip格式大小42.5MB已有1173人学习下载。包内附带部署与使用教程便于初学者快速上手数据库文件用于初始化用户、内容、订单等模块降低搭建成本。整套源码的价值在于可直接运行体验双端应用也能从代码层掌握跨平台技术选型、分销佣金计算、卡密验证、会员权益配置等细节后台功能完整支持用户管理、内容管理、支付接口与数据分析适合二次开发、毕业设计或商业项目参考帮助开发者缩短从需求到上线的周期。1. 影视APP双端源码程序的真实边界它不含服务端和片源影视APP双端源码程序字面上就是 iOS 和 Android 两端客户端工程都齐的源码包。很多人一拿到就解压、点开工程三分钟后又关掉——因为这两端代码默认连的是作者自己的服务端你缺的恰恰是服务端、接口约定和片源。它解决的是从零做一对客户端的问题播放器、首页/分类/搜索 UI、登录与支付入口这些都已经写好你只需要补自己的域名、接口和内容源。它适合两类人手上有正规片源和服务器资源、想做自家品牌的影视团队以及不想在双端 UI 和解码上重造轮子的移动端开发者。如果你只是想拿一套源码“下载即上架”那它做不到后面每一章讲的都是怎么把它变成你自己的东西。2. 拆解影视APP双端源码的技术栈哪一层决定你能不能改2.1 双端是原生还是跨平台影视播放场景的选型逻辑先回答那个最常被问的问题影视APP双端源码原生写的好还是 Flutter、uni-app 这类跨平台写的好我的判断标准只有一条播放是不是核心。影视应用里解码、硬解、内存回收、后台播放这些能力都贴着系统底层原生工程仍然占大多数。跨平台这几年成熟很多但遇到 4K 高码率片源、多音轨切换、投屏这类需求跨平台那层抽象会变成黑匣子出了问题你很难判断是引擎的问题还是自己的代码写错了。做技术选型时可以图省事排查问题时省事的代价都会找回来。拿到源码第一步看顶层目录。有 android/ 和 ios/ 两个独立工程的是原生双端只有一个 lib/ 或 uni-app 的 pages/ 目录的是跨平台。原生双端的优势是两边可以各自调用系统播放能力劣势是业务逻辑要维护两份。所以一套做得规整的影视源码会把网络、数据模型、播放内核放在底层UI 只做渲染做源码评审时先看底层逻辑有没有被 UI 层写死写死的代码后面改一个接口字段都要翻遍全工程。三种形态的差异我做选型时一般这样对比形态播放能力UI 一致性二次开发成本原生双端硬解、后台播放控制最细两端各做一套成本最高但不背播放包袱Flutter靠插件接播放器高码率需自调好要懂 Dart 和平台通道uni-app多数依赖 WebView 或插件好出包快但复杂解码最弱结论很直接影视源码之所以主流仍选原生双端是因为播放器要以“内核”形式嵌进工程而不是以控件形式调用。Android 端常见的 IJKPlayer、ExoPlayeriOS 端常见的 AVPlayer、IJKPlayer对硬解的封装和音视频同步的控制非常细跨平台层要做同样的事绕的路会很长。多音轨切换、外挂字幕、声画同步这些影视 App 的常规诉求跨平台框架提供的 API 往往只覆盖了播放器能力的六成。2.2 拿到源码先读这三处工程入口、模块划分、接口地址拿到源码别急着编译先花十分钟读目录。我一般按下面这个顺序看# 解压或 clone 之后先看顶层结构 ls -la # Android 工程认这几样 ls android/ # settings.gradle、build.gradle、app/ 子模块 cat android/settings.gradle # 看 include 了哪些模块 # iOS 工程认这几样 ls ios/ # xxx.xcworkspace、Podfile、xxx.xcodeproj逻辑说明settings.gradle 决定工程包含哪些子模块模块多不代表功能全很多源码把播放器、支付、推送拆成独立 module好处是你换播放内核时不用动 UI 层。Podfile 是 iOS 的依赖清单影视源码里经常看到 IJKMediaFramework、AFNetworking、SDWebImage 这些库。结构看清楚之后重点找三处代码位置一是网络层里的 BaseUrl二是播放器引擎初始化的地方三是包名 / Bundle Identifier。这三处分别对应“连谁的服务器”“用谁的播放器”“以谁的身份上架”。很多源码包里会附带一份接口文档或者直接用 JSON 注释样例给出字段表客户端和服务端的字段名必须严格对齐。字段对不上表现就是图片能出、播放黑屏而这种问题抓包都不一定一眼看得见。所以读目录时如果看到 doc/、api/ 这类目录先打开里面的 JSON 样例对照一次客户端的数据模型能少走很多弯路。2.3 播放器内核才是源码的心脏IJKPlayer、ExoPlayer 还是 AVPlayer播放器内核决定这套源码的片源兼容范围。常见的三种内核内核可用端优势要注意的ExoPlayerAndroidGoogle 官方HLS/DASH 支持最好扩展性强对旧 Android 版本需要配 Media3 派生包IJKPlayerAndroid/iOSB 站开源FFmpeg 封装格式支持最广项目已停更多年新系统偶发兼容问题AVPlayeriOS苹果原生HLS 优化最好系统级硬解格式受系统限制MP4 老编码要转码判断源码值不值得接看它播放器包一层没有。规整的影视源码不会在 Activity / ViewController 里直接 new 播放器而是有一个 PlayerManager 之类的单例把硬解开关、清晰度切换、错误回调全部收口。这样的代码换内核、调参数都只改一个文件。我见过最省心的源码Android 用 ExoPlayer、iOS 用 AVPlayer中间用一整套统一接口包住片源兼容性和原生化都占住了。换内核的常见做法是在统一接口层做适配比如 Android 端把 IJKPlayer 的 setOption 翻译成 ExoPlayer 的 DefaultTrackSelector 参数。具体到代码通常先在 PlayerManager 里加一个 createPlayer() 工厂方法按 BuildConfig 或配置文件切换内核业务层只调用 play(url)、pause()、seekTo()不感知底层用的是谁。这一层设计得好后面调参数、换内核都会很顺设计得不好所有 Activity 里都是 IJKPlayer 的 log 标签排查问题时光日志就得翻半天。这一段操作上还要记住不管用什么内核片源内容的版权和分发授权要靠你自己解决播放器内核不背这个锅。源码二次开发时尽量别在业务代码里直接依赖某个内核的私有 API否则后面换内核等于重写一遍播放业务。到这里技术栈已经理清。接下来做最实际的事把两端源码跑起来。3. 把影视APP双端源码跑起来Android 与 iOS 的编译实操3.1 Android 端Gradle 同步、Keystore 签名和真机安装Android 端跑通一套源码环境就三样JDK 17、Android Studio、对应版本的 Android Gradle Plugin看根 build.gradle 里写的版本一般源码都会注明。先检查本机环境java -version # 影视源码现在基本要求 JDK 17 cd android/ ./gradlew assembleDebug # 首次会下载依赖时间较长逻辑说明./gradlew 会按工程里的 wrapper 配置自动拉取对应版本的 Gradle所以本机不用手动装 Gradle。首次构建慢绝大多数情况是依赖下载慢解决方法是在根 build.gradle 里加国内可用的镜像仓库。// android/build.gradle 的 repositories 里把访问不稳的源换成镜像 buildscript { repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/public } google() mavenCentral() } }参数说明镜像只替换国外源的地址google() 和 mavenCentral() 保留主要是兼容个别只在官方源里的库如果全部走镜像也碰得到少量依赖拉取失败那就把缺的库单独加到 dependencies 前几位。注意加这段要放在工程根目录的 build.gradle不是 app 模块那份。构建出 Debug 包后真机安装之前先处理签名。开发调试用 Android Studio 自动生成的 debug.keystore 就行但要发布、要装到别人手机上必须用你自己的正式签名。先创建一个 keystorekeytool -genkeypair -v \ -keystore release.jks \ -alias youralias \ -keyalg RSA -keysize 2048 -validity 36500参数说明validity 36500 是 100 年有效期影视线做一次性分发很合适但密码和别名一定要留好丢了等于失去这个应用名的升级权这是很多团队的血泪经验。创建后把 jks 文件放在工程外的目录别提交进 git 仓库。然后用 groovy 把签名配进构建脚本// android/app/build.gradle android { signingConfigs { release { storeFile file(../keystore/release.jks) storePassword 你的密码 keyAlias 你的别名 keyPassword 你的密码 } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled false // 影视源码先不要开混淆排查问题方便 } } }逻辑说明storeFile 用相对路径时注意它相对于 module 目录app/而不是工程根目录写完签名配置用 ./gradlew assembleRelease 出正式包。minifyEnabled 先设 false混淆和资源压缩会在后面验收阶段再开否则 release 包闪退时抓到的堆栈全是混淆后的无意义信息。这一步还经常遇到两个问题。一个是 NDK 版本不对播放器源码大多带 so 库Android Studio 里 SDK Manager 把 NDK、CMake 装齐local.properties 里的 ndk.dir 指对版本问题就消了。另一个是 CPU 架构很多影视源码只在 build.gradle 里写了 abiFilters “armeabi-v7a”, “arm64-v8a”x86 模拟器装不了带 so 的包用真机调试最省事别在模拟器上耗时间。3.2 iOS 端Xcode、CocoaPods 与开发者证书跑通iOS 端的步骤比 Android 更依赖环境和证书顺序错了报错会非常误导人。正确顺序是先装依赖再打开工程再配签名。cd ios/ # 如果源码里没有 Podfile说明用的是静态库或其他依赖方式 pod install --repo-update open YourApp.xcworkspace逻辑说明必须打开 .xcworkspace 而不是 .xcodeproj否则 CocoaPods 引入的依赖全部失效最常见的报错是 “No such module”。pod install 时如果源拉不动先检查源和 CDN不要急着修改源码里的 podspec 版本号——很多“我换成新版本就好”的操作其实是让项目连类名都找不到。跑完 pod install 后用 git status 看一眼Podfile.lock 和 .xcworkspace 的变化要一起提交团队其他人才能同步到同一套依赖。配签名这一步打开 Xcode 选中 targetSigning Capabilities 里勾选 Automatically manage signing再选择你自己的 Team。个人免费 Team 能真机调试但装到非本人设备上有七天有效期的限制而且不能上架 App Store要做正式分发至少需要一个 Apple Developer Program 账号。我收到的不少影视源码iOS 端报错不是代码问题而是 Team 没选、Bundle Identifier 被占或证书类型不对。碰到 “Unable to create a provisioning profile” 时先去检查这个 Bundle ID 是不是跟你在开发者后台已注册的应用重复了换个唯一的前缀再回来签名。真机调试时还要在手机上点一次“信任此开发者”否则安装后打开就闪退这个提示往往被当成代码崩溃来查浪费时间。3.3 把客户端指向你自己的服务端BaseUrl、明文流量与 ATS 开关双端都跑通后默认还是连作者的服务端。把源码变成你自己的起点是改网络层的 BaseUrl。大多数影视源码的网络层集中在某几个文件里搜索 BASE_URL、base_url、server_addr 就能定位。// 网络层示例一处替换全 App 接口自动切换 object ApiClient { // 把这三个常量替换成你自己的接口域名和版本路径 const val BASE_URL https://api.yourdomain.com/v1/ const val API_KEY 你的密钥 const val STREAM_HOST https://cdn.yourdomain.com/ }逻辑说明替换 BaseUrl 后首页栏目、搜索、详情页接口全部切换到新服务端STREAM_HOST 是视频流域名单独抽出来是为了方便做 CDN 切换不用跟着业务接口一起改。如果源码里有多套环境debug/release建议做成 BuildConfig 字段debug 指向测试服务器release 指向正式域名避免调试时频繁改代码。这步之后Android 9 及以上默认禁止明文 HTTPiOS 的 ATS 默认禁止非 HTTPS 请求。如果调试阶段服务端只有 HTTP需要在两端各开一道口子。Android 在 AndroidManifest.xml 的 application 节点加属性application android:usesCleartextTraffictrue tools:targetApi28iOS 在 Info.plist 里加keyNSAppTransportSecurity/key dict keyNSAllowsArbitraryLoads/key true/ /dict参数说明这两个开关只留给本地和内网调试正式上线前必须收紧。Android 的做法是删掉 usesCleartextTraffic改成 networkSecurityConfig只放行你自己的域名iOS 同理把 NSAllowsArbitraryLoads 改回 false需要哪个域名走例外就单独写 NSExceptionDomains。整个影视源码对外分发后如果还有大片 HTTP 流量一方面有被网络环境注入广告的风险另一方面 iOS 审核时被拒的概率非常高。4. 影视APP源码必调的三类参数播放器、防盗链、版本更新4.1 播放器参数硬解开关、缓冲时长和倍速档位跑起来只是第一步播放体验靠参数调。影视源码里有一套参数是几乎每份都要动的先看这一张参数作用建议硬解开关用 MediaCodec 做系统级解码省电、流畅默认开兼容性差的片源需降级软解缓冲时长决定起播速度和卡顿率网速波动大时增大缓冲直播类要减小清晰度切换手动/自动按码率切换默认给“自动”列表里保留 4K/1080P倍速档位UI 层暴露的加/减速档0.52.0 之间给 5 档就够以 IJKPlayer 为例源码里初始化播放器时常见的参数配置ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, mediacodec, 1); // 1 开硬解0 关硬解 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, mediacodec-auto-rotate, 1); // 硬解时自动旋转画面 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, dns_cache_clear, 1); // 切换线路时清 DNS 缓存 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, start-on-prepared, 0); // 预加载若干秒后再播放参数说明mediacodec 是 IJKPlayer 的硬解总开关兼容性差的片源硬解会出现声画不同步切到 0 关掉硬解用 FFmpeg 软解通常能救回来。start-on-prepared 控制音视频准备完成后的立即播放行为置 0 可以配合缓冲参数做出更好的起播效果。ExoPlayer 没有这套 setOption它通过 LoadControl 和 DefaultRenderersFactory 配置字段不同但作用对应。调节奏时记住一个原则别把缓冲调得太大。很多源码默认缓存队列拉满WiFi 下看着流畅切到移动网络时切换清晰度会明显变慢用户感知就是“卡”。移动网络下我会把缓冲控制在能覆盖一次网速抖动的时长而不是越大越好。高清片源还要关注字幕和音轨。源码里如果自带外挂字幕解析检查一下它对 ASS/SRT 的兼容播放器内核切换后字幕的字体渲染经常出问题表现为字幕重叠或乱码这在影视源码里属于高频返工项。4.2 防盗链与鉴权Referer、Token 和自定义 Header影视源码跑通之后立刻要面对的问题就是接口和视频流被外人抓走盗用。常见做法是两层第一层给业务接口做 Token 鉴权第二层给视频流m3u8/mp4 分片做时间戳防盗链。Token 流程一般是用户登录后客户端拿登录态去请求一次播放地址接口服务端生成一个带过期时间的播放 Token客户端再去拉视频流。播放地址接口不是单纯的返回 URL而是连同过期时间、设备信息一起返回// 网络层或播放器初始化时给视频请求挂自定义 Header MapString, String headers new HashMap(); headers.put(Referer, https://yourdomain.com); headers.put(Authorization, Bearer playToken); // 传给播放器的底层请求 videoSource.setHeaders(headers);逻辑说明服务端对每个请求校验 Referer 是否来自你自己的 App 或网页域名再校验 Authorization 里的 Token 是否在有效期内。Token 绑定播放地址的过期时间通常 1530 分钟后失效能挡住“抓一次地址到处转发”的简单盗链。有源码把 Token 直接拼在 URL 后面比如 xxx.mp4?tokenxxx这种在抓包工具里一眼就能全部看光也更难做服务端日志审计。带 Header 的方式也不会让 Token 出现在 CDN 访问日志里。需要清楚的一点是防盗链只能提高盗用成本做不到绝对安全判断标准是“被破解的难度远大于重新做个页面的难度”。鉴权时序上还要注意失效处理播放过程中 Token 过期播放器会拉取下一个分片失败源码里应该监听这个错误然后静默地重新请求播放地址并续播而不是弹回详情页。这个细节很影响体验收到源码后优先确认有没有实现。4.3 版本更新机制给你自己留一颗“后悔药”影视 App 这类分发场景用户手里那版代码一旦出问题无法像网页一样秒修所以源码里都会带版本更新逻辑。跑通服务端后第一件事就是把这个接口接上。常见的更新接口约定是这样一份 JSON{ code: 0, data: { latest_version: 2.1.0, force_update: true, update_desc: 修复部分片源声画不同步, url: https://yourdomain.com/download/app-release.apk } }逻辑说明客户端启动时请求这个接口拿 latest_version 和本地 versionName/versionCode 比较版本更高就弹更新对话框。force_update 为 true 时对话框不提供“跳过”按钮只给“立即更新”和“退出应用”。Android 端下载 APK 安装iOS 端 url 填 App Store 链接跳转过去更新。我一般把 force_update 的开关放在服务端配置里下发而不是打进客户端这样出问题时可以远程把旧版本全部拉回升级通道。这是整个源码里运维价值最高的一块优先级应该排在 UI 细节之前。静默更新也可以做但只建议在修复崩溃类问题时用普通功能更新走用户确认弹窗避免用户完全不知道安装包里被装了什么。5. 影视APP双端源码的避坑指南编译翻车、黑屏与抓包失败5.1 依赖拉不下来Gradle 和 CocoaPods 都卡在同一处现象gradlew 构建停在 “Downloading” 转圈半小时或者 pod install 卡在更新索引过一会报网络超时。原因Gradle 默认源和 CocoaPods 的 CDN 都在海外访问延时高而且国内网络环境里断连非常常见。这不是源码问题是环境问题。解决Gradle 侧在 repositories 里加阿里云镜像CocoaPods 侧把 Podfile 里的 source 换成可访问的镜像源或者事先把需要的 pod 包手动下载放入本地目录再做离线安装。依赖安装失败时先看报错里的 URL几乎每个失败都能定位到具体是哪个源。5.2 视频黑屏或卡死硬解兼容性不是玄学现象部分片源点击播放后黑屏但有声音或者画面卡在首帧日志里能看到解码器报错。换了播放器内核才好的情况也有但多数不是内核的问题。原因视频编码超出了当前硬解方案的支持范围尤其是 H.265 编码、高分辨率高帧率资源在部分旧设备硬解失败。硬解失败后源码如果没有自动降级播放器就一直停在初始状态。解决给播放器监听错误回调硬解出错时自动切到软解再试一次player.setOnErrorListener((mediaPlayer, what, extra) - { // 硬解失败的典型错误码是 what MEDIA_ERROR_IO 或 extra 为负数 if (isHardwareDecodeFailed(what, extra)) { enableSoftwareDecoder(); // 关掉 mediacodec重新 prepare player.reset(); player.setDataSource(videoSource); player.prepareAsync(); } return true; });逻辑说明错误回调里判断错误码属于解码器不支持导致的失败就关闭硬解重新准备一次多数兼容性差的片源会立刻恢复。判断“是解码失败而不是网络失败”是关键网络失败也切软解没有意义反而会拖慢重试速度。软解会明显增加耗电和发热所以只作为兜底路径不要全局默认用软解。5.3 App 抓包失败证书锁定和调试模式现象用 Charles 这类工具给影视 App 抓包业务请求全部看不到界面显示 SSL 握手失败换了一个抓包工具也一样。原因Android 7.0 以后App 默认不信任用户安装的证书影视源码如果做了证书锁定抓包工具的 CA 证书会被直接拒绝。这种“抓包失败”反而说明这套源码的安全性有基本保障。解决Debug 包单独处理。Android 在 debug 下加载一份专门的 networkSecurityConfig信任用户证书或者确认源码里是否预留了 debug 开关来关闭证书锁定。不要试图在 release 包上抓包——那等于要求 App 自废防护。iOS 端同理通过 debug 模式的 ATS 例外放行本机调试域名。抓包的目的是验证接口字段证书锁定验证留到发版前单独做一次就行。5.4 iOS 上架被拒IPv6、内容资质和“浏览器唤起安装”的合规边界现象Xcode 上传后被拒常见理由包括 IPv6 网络测试不通过、使用私有 API、内容资质不完整。原因源码里残留了硬编码的 IPv4 地址或 ATS 配置过宽导致 IPv6 下请求失败影视类应用申请上架时需要准备版权授权等文件源码里自带的占位内容如果没有替换干净也会成为被拒理由。解决检查网络层所有域名和 IP统一走域名CDN 确保支持 IPv6。ATS 收窄只放行自己的 HTTPS 域名。内容资质方面影视类应用申请上架时需要准备版权授权等文件源码里自带的占位内容也要全部替换任何来源不明的内容都不要留在包里。审核被拒不是源码问题是分发形态问题先对照拒绝理由一条条过再重新提交。提示企业签分发绕过了 App Store 审核但同时要自行承担证书吊销风险而且只面向组织内部成员。正式对外分发前先确认这条路是否符合你的业务形态。5.5 安装冲突包名和签名不一致导致升级失败现象手机上一版卸载不了或者安装新包时提示“应用未安装”“与现有应用签名不一致”桌面上出现两个相同图标。原因包名与已安装应用不一致或签名密钥不是同一个。解决改包名时全局搜索老包名别只改 main 目录下的包路径Android 的 applicationId、iOS 的 Bundle Identifier 必须全局唯一且不再变动。签名一致性要从第一次对外包就开始保证沿途复用同一个 keystore并在每次发版前用命令校验apksigner verify --print-certs app-release.apk参数说明输出里的 SHA-256 证书指纹每次发版都要和上一版对比指纹不同说明签名配置串了升级时的安装冲突就来自这里。6. 从源码到可分发版本签名、加固与真机验收技巧6.1 双端签名与加固应用市场和企业分发各怎么做Android 发布前除了正式签名我建议把混淆和加固放到排期里。minifyEnabled 为 false 的包先不做市场分发加固工具能让反编译的人拿到的是壳而不是业务代码。iOS 端没有加固工具这说法App Store 的二进制加密加上代码混淆基本够用企业签分发时包的管理和证书到期时间要单独做记录别等证书到期那天才发现打不了新包。6.2 真机验收播放、断网、来电打断这三关怎么测模拟器只能看 UI播放器必须真机验收。我在给影视源码做验收时只测三件事首帧时间——点进详情页到画面出来控制在 3 秒内断网恢复——播放中开飞行模式播放器要在几秒内给出错误提示恢复网络后能重连而不是白屏来电打断——来电响铃后播放要暂停挂断后回到播放页而不是退回首页。这三关过了大部分线上反馈的“黑屏”“卡死”基本都能杜绝。6.3 iOS 浏览器唤起安装 App企业签与 TestFlight 的验证差异iOS 上没有安卓那种直接装 APK 的路径源码跑通后的分发验证主要在两条路上TestFlight 和“浏览器唤起安装”。TestFlight 是合规首选用户先装 TestFlight再在 Safari 里点邀请链接系统会唤起 TestFlight 并弹出“要安装此 App 吗”流程标准、有设备数量上限但足够小范围验证。企业签分发的安装链路是Safari 打开一个 plist 描述文件地址系统弹出确认框点“安装”后 App 出现在桌面。验证时最容易翻车的环节是 plist 里的 bundle-id 和安装包实际 bundle-id 不一致以及安装包没放到 HTTPS 地址下这两处出错浏览器会一直提示“无法连接到 App”。我自己的操作习惯是每次换证书后先在 iPhone 上完整走一遍“浏览器唤起安装”再发出去避免用户端集体翻车却全赖在代码上。这套源码从拆解、跑通、调参到分发每一步的坑基本都是环境、签名和播放器兼容性而不是业务逻辑有多难。希望这些过程能帮你在接入影视APP双端源码程序时少走一段弯路。本文还有配套的精品资源点击获取
返回列表