# App Upgrade Plugin 一款功能强大且灵活的 Flutter 应用内更新插件,专为提供符合主流平台用户习惯的无缝升级体验而设计。插件提供了简化版和增强版两套 API,满足不同复杂度的使用需求。 ## ✨ 核心特性 - **🎯 智能平台适配**:Android 支持完整的下载-安装流程,iOS 自动跳转 App Store - **🔄 双模式更新**:非强制更新(后台下载)+ 强制更新(阻塞式对话框) - **🛡️ 全面权限管理**:自动适配不同 Android 版本的存储、安装、通知权限 - **📱 现代化 UI**:Material Design 风格对话框,支持暗色主题和自定义样式 - **🌐 健壮网络层**:基于 Dio,支持断点续传、重试机制、证书配置 - **🔒 安全可靠**:MD5/SHA256 文件校验,防止下载文件损坏 - **🎨 高度可定制**:丰富的配置选项和回调接口 ## 📦 安装 在 `pubspec.yaml` 中添加依赖: ```yaml dependencies: app_upgrade_plugin: ^1.0.0 ``` ## 🚀 快速开始 ### 方式一:简化版 API(推荐新手) ```dart import 'package:app_upgrade_plugin/app_upgrade_plugin.dart'; // 一行代码实现完整升级流程 void checkUpdate(BuildContext context) { AppUpgradeSimple.instance.checkUpdate( context: context, url: 'https://your-api.com/check-update', params: {'channel': 'release'}, // 可选参数 showNoUpdateToast: true, autoDownload: true, autoInstall: false, ); } ``` ### 方式二:分离式 API(更灵活) ```dart // 1. 检查更新(纯逻辑,不涉及UI) final upgradeInfo = await AppUpgradeSimple.instance.checkUpdateSilent( url: 'https://your-api.com/check-update', params: {'platform': 'android'}, ); // 2. 根据需要显示UI if (upgradeInfo != null && context.mounted) { AppUpgradeSimple.instance.showUpgradeDialog( context: context, info: upgradeInfo, autoDownload: true, autoInstall: false, ); } ``` ### 方式三:增强版 API(高级用户) ```dart final plugin = AppUpgradePluginEnhanced.instance; // 配置插件 plugin.configure( debugMode: true, wifiOnly: false, autoCheck: true, ); // 添加下载监听 plugin.addDownloadCallback((task) { print('下载进度: ${task.progress}%'); }); // 智能检查更新 final info = await plugin.checkUpdateSmart( 'https://your-api.com/check-update' ); ``` ## 🎨 UI 展示 插件提供多种精美的 UI 组件: - **版本更新对话框**:显示版本信息、更新内容、文件大小 - **下载进度对话框**:实时显示下载进度和状态 - **应用市场选择**:支持多应用商店选择(华为、小米、OPPO等) - **权限申请对话框**:友好的权限说明和引导 ## ⚙️ Android 配置 ### 1. 权限配置 在 `android/app/src/main/AndroidManifest.xml` 中添加: ```xml ``` ### 2. FileProvider 路径配置 创建 `android/app/src/main/res/xml/file_paths.xml`: ```xml ``` ### 3. Gradle 配置(可选) 在 `android/app/build.gradle` 中: ```kotlin android { compileSdk 34 compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 isCoreLibraryDesugaringEnabled = true } } dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") } ``` ## 📡 服务端 API 协议 你的版本检查接口需要返回以下格式的 JSON: ```json { "hasUpdate": true, "isForceUpdate": false, "versionCode": "101", "versionName": "1.0.1", "updateContent": "1. 修复了登录问题\n2. 优化了界面显示\n3. 提升了性能", "downloadUrl": "https://your-cdn.com/app-release.apk", "appStoreUrl": "https://apps.apple.com/app/id123456789", "apkSize": 25165824, "apkMd5": "d41d8cd98f00b204e9800998ecf8427e", "appMarkets": [ { "name": "华为应用市场", "packageName": "com.huawei.appmarket", "url": "appmarket://details?id=com.yourapp.package" }, { "name": "小米应用商店", "packageName": "com.xiaomi.market", "url": "mimarket://details?id=com.yourapp.package" } ] } ``` ### 字段说明 | 字段 | 类型 | 必需 | 说明 | |------|------|------|------| | `hasUpdate` | boolean | ✅ | 是否有更新 | | `isForceUpdate` | boolean | ✅ | 是否强制更新 | | `versionCode` | string | ✅ | 版本号(数字字符串,用于版本比较) | | `versionName` | string | ✅ | 版本名称(显示给用户) | | `updateContent` | string | ✅ | 更新内容描述 | | `downloadUrl` | string | Android必需 | APK下载地址 | | `appStoreUrl` | string | iOS必需 | App Store链接 | | `apkSize` | number | ❌ | APK文件大小(字节) | | `apkMd5` | string | ❌ | APK文件MD5校验值 | | `appMarkets` | array | ❌ | 应用市场列表 | ## 🔧 高级配置 ### 网络配置 ```dart // 自动模式(推荐) // Debug: 自动绕过证书验证 // Release: 严格证书验证 // 手动配置 AppUpgradePlugin().configureHttp(HttpConfig( ignoreCertificate: false, // 是否忽略证书 enableLog: true, // 启用网络日志 connectTimeout: 30, // 连接超时(秒) receiveTimeout: 60, // 接收超时(秒) defaultMethod: 'GET', // 默认请求方法 headers: { // 自定义请求头 'User-Agent': 'MyApp/1.0', }, )); ``` ### 权限管理 插件提供了独立的权限管理工具: ```dart import 'package:app_upgrade_plugin/core/permission_helper.dart'; // 检查并请求存储权限 final hasStorage = await PermissionHelper.checkAndRequestStoragePermission( context: context, ); // 检查并请求安装权限 final hasInstall = await PermissionHelper.checkAndRequestInstallPermission( context: context, ); // 检查并请求通知权限 final hasNotification = await PermissionHelper.checkAndRequestNotificationPermission( context: context, ); ``` ## 🐛 故障排除 ### 常见问题 **Q: 安装失败,提示 "解析包时出现问题"** A: 检查以下几点: - APK 文件是否完整下载(检查文件大小) - APK 签名是否正确 - 设备架构是否匹配(armeabi-v7a, arm64-v8a) **Q: 权限申请失败** A: 确保: - AndroidManifest.xml 中已声明相应权限 - FileProvider 配置正确 - 在 MaterialApp 环境中调用权限申请 **Q: 下载失败或进度不更新** A: 检查: - 网络连接是否正常 - 下载URL是否可访问 - 服务器是否支持断点续传 **Q: iOS 不跳转 App Store** A: 确认: - `appStoreUrl` 字段格式正确 - URL 为有效的 App Store 链接 ### 调试技巧 开启调试模式以获取详细日志: ```dart // 简化版 AppUpgradeSimple.instance.init(debugMode: true); // 增强版 AppUpgradePluginEnhanced.instance.configure(debugMode: true); ``` ## 📚 API 文档 ### AppUpgradeSimple | 方法 | 描述 | |------|------| | `checkUpdate()` | 检查更新并显示UI | | `checkUpdateSilent()` | 静默检查更新 | | `showUpgradeDialog()` | 显示升级对话框 | ### AppUpgradePluginEnhanced | 方法 | 描述 | |------|------| | `configure()` | 配置插件 | | `checkUpdateSmart()` | 智能检查更新 | | `downloadApkSmart()` | 智能下载APK | | `installApkSmart()` | 智能安装APK | | `addDownloadCallback()` | 添加下载监听 | ### PermissionHelper | 方法 | 描述 | |------|------| | `checkAndRequestStoragePermission()` | 存储权限 | | `checkAndRequestInstallPermission()` | 安装权限 | | `checkAndRequestNotificationPermission()` | 通知权限 | ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! ## 📄 许可证 MIT License ## 🔗 相关链接 - [Flutter 官网](https://flutter.dev) - [Android 应用安装权限文档](https://developer.android.com/reference/android/Manifest.permission#REQUEST_INSTALL_PACKAGES) - [FileProvider 使用指南](https://developer.android.com/reference/androidx/core/content/FileProvider)