关于应用 Cordova 与 OpenHarmony 混合开发实战
本文介绍了"关于应用"页面的实现方案,该页面用于展示应用的基本信息(名称、版本、开发者等)并提供相关功能。文章详细说明了Web端和OpenHarmony原生端的代码实现:Web端使用JavaScript渲染页面并处理用户交互,原生端提供应用信息获取、更新检查和分享功能。通过Cordova插件实现两端通信,最终构建了一个完整的应用信息展示系统,支持版本检查、官网访问和分享功能。这
📌 模块概述
关于应用页面是用户了解应用的重要入口,主要包含以下功能模块:
基本信息展示:
应用名称和Logo
当前版本号(包括主版本号、次版本号和修订号)
开发者信息(个人开发者或团队名称)
应用简介(50-100字的简洁描述)
辅助功能:
检查更新按钮
分享应用功能
用户反馈入口
法律信息:
软件许可证(如MIT、GPL等)
隐私政策链接
服务条款链接
🔗 完整流程
第一步:加载应用信息
从应用的配置文件中读取静态信息:
应用名称
版本号(从package.json或manifest中获取)
开发者信息
动态获取信息:
调用原生API获取设备信息
检查网络连接状态
获取用户偏好设置
异常处理:
网络不可用时的降级处理
数据加载失败的重试机制
第二步:显示信息
页面布局:
顶部应用Logo区域
中间信息展示区(卡片式布局)
底部操作按钮区
信息呈现方式:
关键信息使用大号字体
次要信息使用常规字体
链接使用品牌色突出显示
交互设计:
按钮悬停效果
加载动画
错误提示样式
第三步:提供链接
外部链接:
官网链接(在新标签页打开)
社交媒体账号
应用商店页面
内部功能:
反馈表单
帮助中心
常见问题
安全考虑:
所有外部链接添加rel=“noopener”
敏感操作需要二次确认
提供取消选项
🔧 Web代码实现
async renderAbout() {
// 扩展应用信息对象
const appInfo = {
name: '快速笔记',
version: '1.0.0',
buildNumber: '20240615.1',
developer: 'Your Name',
team: 'Awesome Dev Team',
description: '一个简洁高效的笔记应用,支持Markdown和富文本编辑',
features: [
'实时同步',
'多设备支持',
'端到端加密'
],
website: 'https://example.com',
privacyPolicy: 'https://example.com/privacy',
termsOfService: 'https://example.com/terms',
email: 'support@example.com',
socialMedia: {
twitter: '@quicknotes',
facebook: 'quicknotesapp'
}
};
// 生成功能列表HTML
const featuresHTML = appInfo.features.map(f => `<li>${f}</li>`).join('');
return `
<div class="page active">
<div class="page-header">
<div class="app-logo">
<img src="assets/icons/icon-128x128.png" alt="${appInfo.name} Logo">
</div>
<h1 class="page-title">ℹ️ 关于应用</h1>
</div>
<div class="about-content">
<div class="about-card">
<h2>${appInfo.name}</h2>
<div class="version-info">
<p>版本: <span class="highlight">${appInfo.version}</span></p>
<p>构建号: ${appInfo.buildNumber}</p>
</div>
<div class="developer-info">
<p>开发者: ${appInfo.developer}</p>
${appInfo.team ? `<p>团队: ${appInfo.team}</p>` : ''}
</div>
<div class="app-description">
<h3>应用简介</h3>
<p>${appInfo.description}</p>
<ul class="features-list">${featuresHTML}</ul>
</div>
</div>
<div class="action-buttons">
<button onclick="aboutPlugin.checkUpdate()" class="btn btn-primary">
<i class="icon-refresh"></i> 检查更新
</button>
<button onclick="aboutPlugin.shareApp()" class="btn btn-secondary">
<i class="icon-share"></i> 分享应用
</button>
</div>
<div class="about-links">
<a href="${appInfo.website}" target="_blank" rel="noopener" class="link-item">
<i class="icon-globe"></i> 访问官网
</a>
<a href="mailto:${appInfo.email}" class="link-item">
<i class="icon-mail"></i> 联系我们
</a>
<a href="${appInfo.privacyPolicy}" target="_blank" rel="noopener" class="link-item">
<i class="icon-lock"></i> 隐私政策
</a>
</div>
<div class="about-license">
<h3>法律信息</h3>
<p>本应用采用MIT许可证。</p>
<p>© ${new Date().getFullYear()} ${appInfo.developer}. 保留所有权利。</p>
</div>
</div>
</div>
`;
}
// 增强版检查更新功能
async checkUpdate() {
try {
Utils.showLoading('正在检查更新...');
// 添加网络状态检查
if (!navigator.onLine) {
Utils.showToast('网络不可用,请检查连接', 'error');
return;
}
// 调用原生方法检查更新
const result = await this.checkUpdateNative();
if (result.hasUpdate) {
const dialog = await Utils.showConfirmDialog(
'发现新版本',
`发现新版本 ${result.latestVersion},是否立即更新?`,
'更新',
'取消'
);
if (dialog) {
// 执行更新操作
window.open(result.downloadUrl, '_blank');
}
} else {
Utils.showToast('已是最新版本', 'success');
}
} catch (error) {
console.error('检查更新失败:', error);
Utils.showToast('检查更新失败: ' + error.message, 'error');
} finally {
Utils.hideLoading();
}
}
// 增强版分享功能
async shareApp() {
try {
const appInfo = await this.getAppInfo();
const shareText = `推荐使用${appInfo.name} - ${appInfo.description}`;
const shareUrl = appInfo.website;
if (navigator.share) {
await navigator.share({
title: appInfo.name,
text: shareText,
url: shareUrl
});
// 分享成功埋点
Analytics.trackEvent('share_success');
} else {
// 降级方案:复制到剪贴板
await navigator.clipboard.writeText(`${shareText} ${shareUrl}`);
Utils.showToast('链接已复制到剪贴板', 'success');
}
} catch (error) {
if (error.name !== 'AbortError') {
console.error('分享失败:', error);
Utils.showToast('分享失败', 'error');
}
}
}
🔌 OpenHarmony 原生代码
// AboutPlugin.ets - 增强版关于应用插件
import { webview } from '@kit.ArkWeb';
import { common } from '@kit.AbilityKit';
import { bundleManager } from '@kit.AbilityKit';
import { deviceInfo } from '@kit.DeviceInfoKit';
import { network } from '@kit.NetworkKit';
@NativeComponent
export class AboutPlugin {
private context: common.UIAbilityContext;
private webviewController: webview.WebviewController | null = null;
constructor(context: common.UIAbilityContext) {
this.context = context;
}
// 初始化插件
public init(webviewController: webview.WebviewController): void {
this.webviewController = webviewController;
webviewController.registerJavaScriptProxy(
new AboutJSProxy(this),
'aboutPlugin',
['getAppInfo', 'checkUpdate', 'shareApp', 'getDeviceInfo']
);
}
// 获取完整的应用信息
public async getAppInfo(): Promise<any> {
try {
const bundleInfo = await bundleManager.getBundleInfo(this.context.abilityInfo.bundleName);
return {
name: bundleInfo.name,
version: bundleInfo.versionName,
versionCode: bundleInfo.versionCode,
developer: bundleInfo.vendor,
description: this.context.resourceManager.getStringSync($r('app.strings.app_description')),
packageName: bundleInfo.name,
firstInstallTime: bundleInfo.installTime,
lastUpdateTime: bundleInfo.updateTime,
deviceInfo: await this.getDeviceInfo()
};
} catch (error) {
console.error('Failed to get app info:', error);
return null;
}
}
// 获取设备信息
public async getDeviceInfo(): Promise<any> {
try {
const info = deviceInfo.getDeviceInfo();
return {
model: info.model,
deviceType: info.deviceType,
osVersion: info.osFullName,
screenResolution: `${info.screenWidth}x${info.screenHeight}`,
networkType: await this.getNetworkType()
};
} catch (error) {
console.error('Failed to get device info:', error);
return null;
}
}
// 获取网络类型
private async getNetworkType(): Promise<string> {
try {
const netInfo = await network.getDefaultNet();
return netInfo ? netInfo.type : 'unknown';
} catch (error) {
return 'unknown';
}
}
// 增强版检查更新
public async checkUpdate(): Promise<any> {
try {
// 检查网络连接
const netInfo = await network.getDefaultNet();
if (!netInfo || !netInfo.isConnected) {
throw new Error('网络不可用');
}
// 这里应该调用实际的更新检查API
// 模拟API响应
return {
hasUpdate: false,
currentVersion: '1.0.0',
latestVersion: '1.0.0',
releaseNotes: 'Bug修复和性能改进',
downloadUrl: 'https://example.com/download',
isMandatory: false
};
} catch (error) {
console.error('Failed to check update:', error);
throw error;
}
}
// 增强版分享功能
public async shareApp(): Promise<boolean> {
try {
const appInfo = await this.getAppInfo();
const shareInfo = {
title: appInfo.name,
content: appInfo.description,
url: 'https://example.com/download'
};
// 调用系统分享
// 注意:OpenHarmony当前版本可能需要使用系统能力
console.log('Sharing:', shareInfo);
return true;
} catch (error) {
console.error('Failed to share app:', error);
return false;
}
}
}
// AboutJSProxy.ets - 增强版JavaScript代理类
class AboutJSProxy {
private plugin: AboutPlugin;
constructor(plugin: AboutPlugin) {
this.plugin = plugin;
}
async getAppInfo(): Promise<any> {
try {
const info = await this.plugin.getAppInfo();
console.log('App info:', info);
return info;
} catch (error) {
console.error('Failed to get app info:', error);
return null;
}
}
async checkUpdate(): Promise<any> {
try {
const result = await this.plugin.checkUpdate();
console.log('Update check result:', result);
return result;
} catch (error) {
console.error('Failed to check update:', error);
throw error;
}
}
async shareApp(): Promise<boolean> {
try {
const success = await this.plugin.shareApp();
console.log('Share completed:', success);
return success;
} catch (error) {
console.error('Failed to share app:', error);
return false;
}
}
async getDeviceInfo(): Promise<any> {
try {
const info = await this.plugin.getDeviceInfo();
console.log('Device info:', info);
return info;
} catch (error) {
console.error('Failed to get device info:', error);
return null;
}
}
}
Web-Native 通信
// 增强版原生方法调用
const NativeBridge = {
// 检查更新
async checkUpdateNative() {
return new Promise((resolve, reject) => {
if (!window.cordova) {
reject(new Error('Cordova未初始化'));
return;
}
cordova.exec(
(result) => {
try {
const data = typeof result === 'string' ? JSON.parse(result) : result;
resolve(data);
} catch (e) {
reject(e);
}
},
(error) => {
reject(new Error(error || '检查更新失败'));
},
'AboutPlugin',
'checkUpdate',
[]
);
});
},
// 分享应用
async shareAppNative(shareOptions = {}) {
return new Promise((resolve, reject) => {
cordova.exec(
(success) => resolve(success),
(error) => reject(new Error(error || '分享失败')),
'AboutPlugin',
'shareApp',
[JSON.stringify(shareOptions)]
);
});
},
// 获取应用信息
async getAppInfoNative() {
return new Promise((resolve, reject) => {
cordova.exec(
(info) => {
try {
const data = typeof info === 'string' ? JSON.parse(info) : info;
resolve(data);
} catch (e) {
reject(e);
}
},
(error) => reject(new Error(error || '获取应用信息失败')),
'AboutPlugin',
'getAppInfo',
[]
);
});
},
// 获取设备信息
async getDeviceInfoNative() {
return new Promise((resolve, reject) => {
cordova.exec(
(info) => {
try {
const data = typeof info === 'string' ? JSON.parse(info) : info;
resolve(data);
} catch (e) {
reject(e);
}
},
(error) => reject(new Error(error || '获取设备信息失败')),
'AboutPlugin',
'getDeviceInfo',
[]
);
});
}
};
// 在Web页面中的使用示例
async function initAboutPage() {
try {
// 获取应用和设备信息
const [appInfo, deviceInfo] = await Promise.all([
NativeBridge.getAppInfoNative(),
NativeBridge.getDeviceInfoNative()
]);
console.log('App Info:', appInfo);
console.log('Device Info:', deviceInfo);
// 更新UI
updateAppInfoUI(appInfo, deviceInfo);
// 设置事件监听
document.getElementById('checkUpdateBtn').addEventListener('click', async () => {
try {
const updateInfo = await NativeBridge.checkUpdateNative();
handleUpdateResult(updateInfo);
} catch (error) {
showErrorToast(error.message);
}
});
document.getElementById('shareAppBtn').addEventListener('click', async () => {
try {
await NativeBridge.shareAppNative({
title: appInfo.name,
text: appInfo.description,
url: appInfo.website
});
showSuccessToast('分享成功');
} catch (error) {
showErrorToast(error.message);
}
});
} catch (error) {
console.error('初始化关于页面失败:', error);
showErrorToast('初始化失败');
}
}
📝 总结
这个增强版的关于应用功能模块提供了更完整的实现方案:
信息展示更全面:
增加了构建号、安装时间等详细信息
显示设备信息帮助调试
提供完整的功能列表
用户体验优化:添加了加载状态指示
完善的错误处理机制
网络状态检测和降级方案
功能增强:
更新检查支持版本对比和强制更新
分享功能提供多种方式
支持获取详细的设备信息
代码健壮性:
完善的类型检查
全面的错误处理
详细的日志记录
扩展性:
模块化设计方便功能扩展
清晰的接口定义
支持未来新增功能
这个实现方案可以很好地满足大多数应用关于页面的需求,同时为未来的功能扩展预留了空间。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐


所有评论(0)