Files
oneapp_docs/basic_utils/basic_platform.md

495 lines
12 KiB
Markdown
Raw Normal View History

2025-09-24 14:08:54 +08:00
# Basic Platform 平台适配模块
## 模块概述
`basic_platform` 是 OneApp 基础工具模块群中的平台适配模块,负责统一处理 Android 和 iOS 平台的差异性,提供跨平台的统一接口。该模块封装了设备信息获取、权限管理、平台特性检测等功能。
### 基本信息
- **模块名称**: basic_platform
- **版本**: 0.2.14+1
- **描述**: 跨平台适配基础模块
- **Flutter 版本**: >=2.10.5
- **Dart 版本**: >=3.0.0 <4.0.0
## 功能特性
### 核心功能
1. **平台信息检测**
- 操作系统类型和版本
- 设备型号和硬件信息
- 应用版本和构建信息
- 网络环境检测
2. **权限管理统一**
- 跨平台权限申请
- 权限状态检查
- 权限结果处理
- 权限设置引导
3. **设备特性适配**
- 屏幕方向控制
- 设备唤醒管理
- 平台特定功能检测
- 硬件能力查询
4. **存储路径管理**
- 应用目录获取
- 缓存目录管理
- 外部存储访问
- 临时文件处理
## 技术架构
### 目录结构
```
lib/
├── basic_platform.dart # 模块入口文件
├── src/ # 源代码目录
│ ├── platform_info/ # 平台信息
│ ├── permissions/ # 权限管理
│ ├── device/ # 设备功能
│ ├── storage/ # 存储管理
│ ├── models/ # 数据模型
│ └── utils/ # 工具类
├── android/ # Android特定代码
├── ios/ # iOS特定代码
└── test/ # 测试文件
```
### 依赖关系
#### 核心依赖
- `basic_storage: ^0.2.2` - 基础存储框架
- `permission_handler: ^10.4.5` - 权限处理插件
- `native_device_orientation: ^1.2.1` - 设备方向控制
## 核心模块分析
### 1. 模块入口 (`basic_platform.dart`)
**功能职责**:
- 平台适配服务统一导出
- 初始化配置管理
- 单例模式实现
### 2. 平台信息 (`src/platform_info/`)
**功能职责**:
- 操作系统信息获取
- 设备硬件信息查询
- 应用程序信息获取
- 环境配置检测
**主要组件**:
- `PlatformInfo` - 平台信息管理器
- `DeviceInfo` - 设备信息获取器
- `AppInfo` - 应用信息管理器
- `SystemInfo` - 系统信息收集器
### 3. 权限管理 (`src/permissions/`)
**功能职责**:
- 统一权限申请接口
- 权限状态查询
- 权限结果回调处理
- 权限设置页面跳转
**主要组件**:
- `PermissionManager` - 权限管理器
- `PermissionChecker` - 权限检查器
- `PermissionRequestor` - 权限申请器
- `PermissionGuide` - 权限引导器
### 4. 设备功能 (`src/device/`)
**功能职责**:
- 设备方向控制
- 屏幕亮度管理
- 震动反馈控制
- 设备唤醒管理
**主要组件**:
- `OrientationController` - 方向控制器
- `BrightnessController` - 亮度控制器
- `HapticController` - 震动控制器
- `WakeController` - 唤醒控制器
### 5. 存储管理 (`src/storage/`)
**功能职责**:
- 应用目录路径获取
- 外部存储访问
- 临时文件管理
- 缓存目录处理
**主要组件**:
- `StorageManager` - 存储管理器
- `PathProvider` - 路径提供器
- `DirectoryManager` - 目录管理器
- `TempFileManager` - 临时文件管理器
### 6. 数据模型 (`src/models/`)
**功能职责**:
- 平台信息数据模型
- 权限状态模型
- 设备特性模型
- 配置参数模型
**主要模型**:
- `PlatformData` - 平台数据模型
- `PermissionStatus` - 权限状态模型
- `DeviceCapability` - 设备能力模型
- `PlatformConfig` - 平台配置模型
### 7. 工具类 (`src/utils/`)
**功能职责**:
- 平台判断工具
- 版本比较工具
- 路径处理工具
- 异常处理工具
**主要工具**:
- `PlatformUtils` - 平台工具类
- `VersionUtils` - 版本工具类
- `PathUtils` - 路径工具类
- `ExceptionUtils` - 异常工具类
## 平台适配实现
### Android 平台适配
#### 权限处理
```dart
class AndroidPermissionHandler {
static Future<bool> requestPermission(Permission permission) async {
final status = await permission.request();
switch (status) {
case PermissionStatus.granted:
return true;
case PermissionStatus.denied:
return false;
case PermissionStatus.permanentlyDenied:
await openAppSettings();
return false;
default:
return false;
}
}
static Future<Map<Permission, PermissionStatus>> requestMultiple(
List<Permission> permissions,
) async {
return await permissions.request();
}
}
```
#### 设备信息获取
```dart
class AndroidDeviceInfo {
static Future<AndroidDeviceData> getDeviceInfo() async {
final deviceInfo = DeviceInfoPlugin();
final androidInfo = await deviceInfo.androidInfo;
return AndroidDeviceData(
manufacturer: androidInfo.manufacturer,
model: androidInfo.model,
version: androidInfo.version.release,
sdkInt: androidInfo.version.sdkInt,
brand: androidInfo.brand,
product: androidInfo.product,
);
}
}
```
### iOS 平台适配
#### 权限处理
```dart
class IOSPermissionHandler {
static Future<bool> requestPermission(Permission permission) async {
final status = await permission.request();
if (status == PermissionStatus.denied ||
status == PermissionStatus.permanentlyDenied) {
return await _showPermissionDialog(permission);
}
return status == PermissionStatus.granted;
}
static Future<bool> _showPermissionDialog(Permission permission) async {
// 显示权限说明对话框
// 引导用户到设置页面
return false;
}
}
```
#### 设备信息获取
```dart
class IOSDeviceInfo {
static Future<IOSDeviceData> getDeviceInfo() async {
final deviceInfo = DeviceInfoPlugin();
final iosInfo = await deviceInfo.iosInfo;
return IOSDeviceData(
name: iosInfo.name,
model: iosInfo.model,
systemName: iosInfo.systemName,
systemVersion: iosInfo.systemVersion,
identifierForVendor: iosInfo.identifierForVendor,
isPhysicalDevice: iosInfo.isPhysicalDevice,
);
}
}
```
## 业务流程
### 权限申请流程
```mermaid
graph TD
A[应用请求权限] --> B[检查权限状态]
B --> C{权限是否已授予}
C -->|是| D[直接使用功能]
C -->|否| E[显示权限说明]
E --> F[请求系统权限]
F --> G{用户是否同意}
G -->|是| H[权限授予成功]
G -->|否| I{是否永久拒绝}
I -->|是| J[引导用户到设置]
I -->|否| K[记录拒绝状态]
H --> D
J --> L[用户手动设置]
K --> M[功能降级处理]
L --> N[重新检查权限]
N --> C
```
### 平台初始化流程
```mermaid
graph TD
A[应用启动] --> B[初始化平台模块]
B --> C[检测平台类型]
C --> D[加载平台配置]
D --> E[初始化平台服务]
E --> F[注册权限监听器]
F --> G[设置默认配置]
G --> H[平台初始化完成]
H --> I[通知上层应用]
```
## 权限管理系统
### 支持的权限类型
1. **基础权限**
- 网络访问权限
- 存储读写权限
- 设备信息访问
- 应用安装权限
2. **隐私权限**
- 位置信息权限
- 相机访问权限
- 麦克风权限
- 通讯录权限
3. **系统权限**
- 电话状态权限
- 短信发送权限
- 系统设置修改
- 设备管理权限
### 权限管理策略
- **最小权限原则**: 仅申请必要权限
- **延迟申请**: 在需要时才申请权限
- **用户友好**: 提供清晰的权限说明
- **优雅降级**: 权限拒绝时的替代方案
## 设备适配策略
### 屏幕适配
```dart
class ScreenAdapter {
static double getScaleFactor() {
final window = WidgetsBinding.instance.window;
return window.devicePixelRatio;
}
static Size getScreenSize() {
final window = WidgetsBinding.instance.window;
return window.physicalSize / window.devicePixelRatio;
}
static bool isTablet() {
final size = getScreenSize();
final diagonal = sqrt(pow(size.width, 2) + pow(size.height, 2));
return diagonal > 1100; // 7 inch threshold
}
}
```
### 性能优化
```dart
class PerformanceOptimizer {
static bool isLowEndDevice() {
if (Platform.isAndroid) {
return _checkAndroidPerformance();
} else if (Platform.isIOS) {
return _checkIOSPerformance();
}
return false;
}
static bool _checkAndroidPerformance() {
// 基于 Android 设备性能指标判断
// RAM、CPU、GPU 等参数
return false;
}
static bool _checkIOSPerformance() {
// 基于 iOS 设备型号判断
// 设备代数、处理器类型等
return false;
}
}
```
## 存储路径管理
### 路径类型
1. **应用目录**
- 应用私有目录
- 文档目录
- 库目录
- 支持文件目录
2. **缓存目录**
- 临时缓存
- 图片缓存
- 数据缓存
- 网络缓存
3. **外部存储**
- 公共文档目录
- 下载目录
- 图片目录
- 媒体目录
### 路径获取接口
```dart
class PlatformPaths {
static Future<String> getApplicationDocumentsDirectory() async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
static Future<String> getTemporaryDirectory() async {
final directory = await getTemporaryDirectory();
return directory.path;
}
static Future<String?> getExternalStorageDirectory() async {
if (Platform.isAndroid) {
final directory = await getExternalStorageDirectory();
return directory?.path;
}
return null;
}
}
```
## 异常处理机制
### 异常类型
1. **权限异常**
- 权限拒绝异常
- 权限配置错误
- 系统权限限制
2. **平台异常**
- 不支持的平台功能
- API版本不兼容
- 硬件功能缺失
3. **系统异常**
- 文件系统错误
- 网络连接异常
- 内存不足异常
### 异常处理策略
- **异常捕获**: 全面的异常捕获机制
- **错误恢复**: 自动错误恢复策略
- **用户提示**: 友好的错误提示信息
- **日志记录**: 详细的错误日志记录
## 测试策略
### 单元测试
- **平台检测测试**: 平台类型识别
- **权限管理测试**: 权限申请和状态
- **路径获取测试**: 各种路径获取
- **工具类测试**: 工具方法功能
### 集成测试
- **跨平台兼容测试**: 不同平台功能
- **权限流程测试**: 完整权限流程
- **设备适配测试**: 不同设备适配
- **性能测试**: 模块性能表现
### 兼容性测试
- **系统版本兼容**: 不同系统版本
- **设备型号兼容**: 不同设备型号
- **权限策略兼容**: 不同权限策略
- **API兼容性**: 不同API版本
## 配置管理
### 平台配置
```dart
class PlatformConfig {
static const Map<String, dynamic> androidConfig = {
'minSdkVersion': 21,
'targetSdkVersion': 33,
'requiredPermissions': [
'android.permission.INTERNET',
'android.permission.ACCESS_NETWORK_STATE',
],
};
static const Map<String, dynamic> iosConfig = {
'minIOSVersion': '11.0',
'requiredCapabilities': [
'arm64',
],
'privacyDescriptions': {
'NSLocationWhenInUseUsageDescription': 'App needs location access',
'NSCameraUsageDescription': 'App needs camera access',
},
};
}
```
## 最佳实践
### 开发建议
1. **统一接口**: 使用统一的平台接口
2. **异步处理**: 耗时操作异步执行
3. **异常处理**: 完善的异常处理机制
4. **性能考虑**: 避免频繁的平台调用
### 使用指南
1. **权限申请**: 在合适的时机申请权限
2. **平台检测**: 根据平台提供不同功能
3. **路径使用**: 正确使用各种存储路径
4. **错误处理**: 妥善处理平台相关错误
## 总结
`basic_platform` 模块作为 OneApp 的平台适配基础模块,为应用提供了统一的跨平台接口和能力。通过封装平台差异性、统一权限管理和完善的异常处理,显著简化了跨平台开发的复杂性。模块具有良好的扩展性和兼容性,能够适应不断变化的平台环境和需求。