设备信息 #
一、插件安装 #
bash
npm install @capacitor/device
npx cap sync
二、获取设备信息 #
2.1 基本设备信息 #
typescript
import { Device, DeviceInfo } from '@capacitor/device';
async function getDeviceInfo(): Promise<DeviceInfo> {
const info = await Device.getInfo();
console.log('设备名称:', info.name);
console.log('设备型号:', info.model);
console.log('平台:', info.platform);
console.log('操作系统:', info.operatingSystem);
console.log('系统版本:', info.osVersion);
console.log('制造商:', info.manufacturer);
console.log('是否虚拟设备:', info.isVirtual);
console.log('内存使用:', info.memUsed);
console.log('磁盘剩余:', info.diskFree);
console.log('磁盘总量:', info.diskTotal);
return info;
}
2.2 设备信息结构 #
typescript
interface DeviceInfo {
// 设备名称
name: string;
// 设备型号
model: string;
// 平台类型
platform: 'ios' | 'android' | 'web';
// 操作系统
operatingSystem: string;
// 系统版本
osVersion: string;
// 制造商
manufacturer: string;
// 是否虚拟设备
isVirtual: boolean;
// 内存使用量(字节)
memUsed?: number;
// 磁盘剩余空间(字节)
diskFree?: number;
// 磁盘总空间(字节)
diskTotal?: number;
// 应用版本
appVersion?: string;
// 应用构建号
appBuild?: string;
// 应用ID
appId?: string;
// 设备UUID
uuid?: string;
}
2.3 获取设备ID #
typescript
async function getDeviceId(): Promise<string> {
const { identifier } = await Device.getId();
return identifier;
}
// iOS: 返回设备UUID
// Android: 返回Android ID
// Web: 返回生成的UUID(存储在localStorage)
三、电池信息 #
3.1 获取电池状态 #
typescript
import { Device, BatteryInfo } from '@capacitor/device';
async function getBatteryInfo(): Promise<BatteryInfo> {
const info = await Device.getBatteryInfo();
console.log('电量:', info.batteryLevel);
console.log('是否充电:', info.isCharging);
return info;
}
3.2 电池信息结构 #
typescript
interface BatteryInfo {
// 电量(0-1)
batteryLevel?: number;
// 是否正在充电
isCharging?: boolean;
}
3.3 监听电池变化(Web) #
typescript
// Web平台使用Battery API
if ('getBattery' in navigator) {
const battery = await (navigator as any).getBattery();
battery.addEventListener('levelchange', () => {
console.log('Battery level:', battery.level);
});
battery.addEventListener('chargingchange', () => {
console.log('Charging:', battery.charging);
});
}
四、语言和地区 #
4.1 获取语言代码 #
typescript
async function getLanguageCode(): Promise<string> {
const { value } = await Device.getLanguageCode();
return value;
}
// 返回示例: 'zh-CN', 'en-US', 'ja-JP'
4.2 获取语言标签 #
typescript
async function getLanguageTag(): Promise<string> {
const { value } = await Device.getLanguageTag();
return value;
}
五、设备信息封装 #
5.1 设备信息服务 #
typescript
// src/services/device.service.ts
import { Device, DeviceInfo, BatteryInfo } from '@capacitor/device';
class DeviceService {
private deviceInfo: DeviceInfo | null = null;
private deviceId: string | null = null;
async init(): Promise<void> {
this.deviceInfo = await Device.getInfo();
const { identifier } = await Device.getId();
this.deviceId = identifier;
}
getInfo(): DeviceInfo | null {
return this.deviceInfo;
}
getId(): string | null {
return this.deviceId;
}
async getBatteryInfo(): Promise<BatteryInfo> {
return Device.getBatteryInfo();
}
async getLanguageCode(): Promise<string> {
const { value } = await Device.getLanguageCode();
return value;
}
isIOS(): boolean {
return this.deviceInfo?.platform === 'ios';
}
isAndroid(): boolean {
return this.deviceInfo?.platform === 'android';
}
isWeb(): boolean {
return this.deviceInfo?.platform === 'web';
}
isVirtual(): boolean {
return this.deviceInfo?.isVirtual ?? false;
}
getPlatform(): 'ios' | 'android' | 'web' | null {
return this.deviceInfo?.platform ?? null;
}
getOSVersion(): string | null {
return this.deviceInfo?.osVersion ?? null;
}
getModel(): string | null {
return this.deviceInfo?.model ?? null;
}
getManufacturer(): string | null {
return this.deviceInfo?.manufacturer ?? null;
}
async getStorageInfo(): Promise<{
free: number;
total: number;
used: number;
usedPercent: number;
}> {
if (!this.deviceInfo) {
await this.init();
}
const free = this.deviceInfo?.diskFree ?? 0;
const total = this.deviceInfo?.diskTotal ?? 0;
const used = total - free;
return {
free,
total,
used,
usedPercent: total > 0 ? (used / total) * 100 : 0
};
}
formatBytes(bytes: number): string {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
getDeviceInfoSummary(): string {
if (!this.deviceInfo) return 'Unknown';
return [
`${this.deviceInfo.manufacturer} ${this.deviceInfo.model}`,
`${this.deviceInfo.operatingSystem} ${this.deviceInfo.osVersion}`,
`Platform: ${this.deviceInfo.platform}`
].join('\n');
}
}
export const deviceService = new DeviceService();
5.2 使用示例 #
typescript
// 初始化
await deviceService.init();
// 获取设备信息
const info = deviceService.getInfo();
console.log('Device:', info?.model);
// 检查平台
if (deviceService.isIOS()) {
console.log('Running on iOS');
}
// 获取存储信息
const storage = await deviceService.getStorageInfo();
console.log(`Storage: ${deviceService.formatBytes(storage.free)} free`);
// 获取电池信息
const battery = await deviceService.getBatteryInfo();
console.log(`Battery: ${Math.round((battery.batteryLevel ?? 0) * 100)}%`);
六、设备特性检测 #
6.1 特性检测服务 #
typescript
// src/services/feature.service.ts
import { Device } from '@capacitor/device';
class FeatureService {
async checkFeatures() {
return {
camera: await this.hasCamera(),
location: await this.hasLocation(),
bluetooth: await this.hasBluetooth(),
nfc: await this.hasNFC(),
biometric: await this.hasBiometric()
};
}
private async hasCamera(): Promise<boolean> {
try {
const { camera } = await Device.getInfo();
return camera !== undefined;
} catch {
return false;
}
}
private async hasLocation(): Promise<boolean> {
return 'geolocation' in navigator;
}
private async hasBluetooth(): Promise<boolean> {
return 'bluetooth' in navigator;
}
private async hasNFC(): Promise<boolean> {
return 'NDEFReader' in window;
}
private async hasBiometric(): Promise<boolean> {
// 需要额外插件检测
return false;
}
}
export const featureService = new FeatureService();
七、完整示例 #
7.1 React组件 #
tsx
import { useState, useEffect } from 'react';
import { Device, DeviceInfo, BatteryInfo } from '@capacitor/device';
function DeviceInfoDisplay() {
const [deviceInfo, setDeviceInfo] = useState<DeviceInfo | null>(null);
const [batteryInfo, setBatteryInfo] = useState<BatteryInfo | null>(null);
const [deviceId, setDeviceId] = useState<string>('');
const [language, setLanguage] = useState<string>('');
useEffect(() => {
loadDeviceInfo();
}, []);
async function loadDeviceInfo() {
const info = await Device.getInfo();
setDeviceInfo(info);
const { identifier } = await Device.getId();
setDeviceId(identifier);
const battery = await Device.getBatteryInfo();
setBatteryInfo(battery);
const { value } = await Device.getLanguageCode();
setLanguage(value);
}
if (!deviceInfo) {
return <div>Loading...</div>;
}
return (
<div className="device-info">
<h2>设备信息</h2>
<div className="info-section">
<h3>基本信息</h3>
<p>名称: {deviceInfo.name}</p>
<p>型号: {deviceInfo.model}</p>
<p>制造商: {deviceInfo.manufacturer}</p>
<p>平台: {deviceInfo.platform}</p>
<p>操作系统: {deviceInfo.operatingSystem}</p>
<p>系统版本: {deviceInfo.osVersion}</p>
<p>虚拟设备: {deviceInfo.isVirtual ? '是' : '否'}</p>
</div>
<div className="info-section">
<h3>设备ID</h3>
<p>{deviceId}</p>
</div>
<div className="info-section">
<h3>电池信息</h3>
<p>电量: {batteryInfo?.batteryLevel ? `${Math.round(batteryInfo.batteryLevel * 100)}%` : '未知'}</p>
<p>充电状态: {batteryInfo?.isCharging ? '充电中' : '未充电'}</p>
</div>
<div className="info-section">
<h3>存储信息</h3>
<p>磁盘剩余: {formatBytes(deviceInfo.diskFree || 0)}</p>
<p>磁盘总量: {formatBytes(deviceInfo.diskTotal || 0)}</p>
</div>
<div className="info-section">
<h3>语言设置</h3>
<p>{language}</p>
</div>
</div>
);
}
function formatBytes(bytes: number): string {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
export default DeviceInfoDisplay;
八、平台差异处理 #
8.1 平台适配 #
typescript
import { Capacitor } from '@capacitor/core';
import { Device } from '@capacitor/device';
async function getPlatformSpecificInfo() {
const info = await Device.getInfo();
switch (info.platform) {
case 'ios':
return {
store: 'App Store',
pushService: 'APNs',
features: ['Face ID', 'iCloud']
};
case 'android':
return {
store: 'Google Play',
pushService: 'FCM',
features: ['Fingerprint', 'Google Services']
};
case 'web':
return {
store: 'Web',
pushService: 'Web Push',
features: ['Service Worker', 'PWA']
};
}
}
九、总结 #
9.1 核心API #
| 方法 | 说明 |
|---|---|
| Device.getInfo() | 获取设备信息 |
| Device.getId() | 获取设备ID |
| Device.getBatteryInfo() | 获取电池信息 |
| Device.getLanguageCode() | 获取语言代码 |
| Device.getLanguageTag() | 获取语言标签 |
9.2 下一步 #
了解设备信息后,让我们学习 iOS集成!
最后更新:2026-03-28