• [问题求助] 安装华为乾坤终端后,部分游戏进不去的解决方案
     安装乾坤后,部分游戏会出现这个页面 打开信任区,选择游戏相关的文件,然后信任这个文件夹即可解决。  
  • [问题求助] HUAWEI Pura 70 Ultra手机无网络下在富文本中插入本地图片会看不见图片
    HUAWEI Pura 70 Ultra手机无网络下在富文本中插入本地图片会看不见图片,呈现这种,其它手机正常显示图片。HUAWEI Pura 70 Ultra用的版本是4.2.0的。分析可能是系统兼容性问题:华为Pura 70 Ultra可能有一些特定的系统设置或优化,导致某些应用在无网络状态下无法正确显示本地图片请问怎么解决?
  • [开发技术领域专区] 开发者技术支持-鸿蒙应用 WebView 拉起 H5 页面技术总结
    开发者技术支持-鸿蒙应用WebView拉起H5页面技术总结一、关键技术总结1 问题说明在鸿蒙应用开发中,通过 WebView 拉起H5应用是常见场景,但原生 WebView 使用过程中会暴露出多方面痛点,具体如下:(一)H5 应用加载失败或功能异常 WebView 初始化后,H5 页面可能出现空白、资源加载失败(如 JS/CSS 文件无法加载),或 H5 内存储功能(如 localStorage)失效。例如,加载需要保存用户配置的 H5 应用时,数据无法持久化,每次重新打开都需重新配置;部分依赖 DOM 存储的交互功能(如表单暂存)完全无法使用,导致 H5 应用核心功能瘫痪。(二)H5 麦克风等权限申请无响应 当H5应用需要调用摄像头或麦克风(如语音录制)时,既无系统权限弹窗,也无应用内提示,H5直接提示“权限不足”。例如,使用H5版视频会议应用时,无法开启摄像头,导致无法参与视频互动;语音输入功能点击后无反应,只能通过文字交互,严重影响 H5 应用的使用场景覆盖。(三)多权限配置与交互冲突 为实现 H5 正常运行,需配置网络、摄像头、麦克风等多种权限,但权限配置格式错误(如缺少 usedScene)会导致权限申请被系统拦截;同时,WebView 的权限请求事件(onPermissionRequest)未处理,会导致H5发起的权限申请与系统权限逻辑脱节。例如,系统已授予摄像头权限,但H5仍无法调用,需手动关联权限授予结果与 WebView 的权限响应。2 原因分析(一)WebView 核心配置与权限缺失未开启必要功能:Web 组件默认关闭 domStorageAccess(DOM 存储)、fileAccess(文件访问)等配置,H5 依赖的存储、文件交互功能无法正常启用;权限声明不完整:H5 加载需 INTERNET 权限,相机或者录音功能需 CAMERA/MICROPHONE 权限,若未在 module.json5 中声明,或敏感权限未配置 reason/usedScene,系统会直接拦截相关请求;调试功能未启用:未在 WebView 初始化前调用 setWebDebuggingAccess (true),或调用时机错误(如在 build 生命周期调用),导致调试接口未生效。(二)权限申请与响应逻辑断裂系统权限与 WebView 权限脱节:鸿蒙敏感权限(摄像头 / 麦克风)需通过 abilityAccessCtrl 动态申请,但即使系统授予权限,WebView 未监听 onPermissionRequest 事件,仍会拒绝 H5 的权限请求;无权限反馈机制:H5 发起权限申请后,未通过 AlertDialog 等组件让用户确认,导致 WebView 无法将系统权限传递给 H5,形成 “系统已授权,但 H5 无权限” 的矛盾。(三)WebView 实例与生命周期管理不当控制器未关联:未创建 WebviewController 实例或未绑定到 Web 组件,导致无法管理 H5 页面加载、存储路径配置等核心逻辑;调试时机错误:在 WebView 初始化完成后(如 build 阶段)调用 setWebDebuggingAccess (true),此时 WebView 底层已初始化,调试接口无法注入,导致调试功能失效。3 解决思路(一)核心配置与权限一体化处理标准化 WebView 初始化流程:在组件 aboutToAppear 生命周期启用调试功能,确保调试接口生效;为 Web 组件开启 domStorageAccess、databaseAccess 等必要配置,覆盖 H5 存储、文件交互需求;权限分层配置:按 “基础权限(INTERNET)+ 敏感权限(CAMERA/MICROPHONE)” 分层声明,基础权限保障 H5 加载,敏感权限按需申请;同时严格遵循鸿蒙权限配置格式,补充 reason/usedScene,避免系统拦截。(二)权限申请与 WebView 响应联动双重权限校验:先通过 abilityAccessCtrl 动态申请系统权限,确保应用本身拥有摄像头 / 麦克风权限;再监听 WebView 的 onPermissionRequest 事件,将系统权限结果传递给 H5,形成 “系统授权→WebView 响应→H5 可用” 的完整链路;用户交互强化:通过 AlertDialog 处理 H5 权限请求,让用户明确知晓 H5 的权限用途,避免盲目授权,同时确保权限响应逻辑闭环。(三)调试与实例管理规范化调试功能前置:在 WebviewController 创建后、Web 组件渲染前启用调试,确保 Chrome DevTools 可识别 WebView 实例;控制器绑定与状态同步:使用 @State/@Link 管理 WebviewController 实例与 H5 加载状态,确保 Web 组件与控制器强关联,避免因实例丢失导致功能异常。4 解决方案(一)工具函数:权限辅助(复用基础能力)此处复用鸿蒙常用工具函数思想,封装权限检查、日期格式化(可选,用于 H5 时间相关交互)工具,提升代码复用性:// 权限检查工具函数:判断是否已获取目标权限// 权限检查工具函数:判断是否已获取目标权限 import { abilityAccessCtrl, PermissionRequestResult, Permissions } from '@kit.AbilityKit'; import { promptAction } from '@kit.ArkUI'; /** * 检查指定权限是否已授予 * @param permissions 待检查权限(如['ohos.permission.CAMERA']) * @returns 布尔值,true表示所有权限已授予 */ export async function requestSensitivePermissions(context:Context,permissions: Permissions[]) { const atManager = abilityAccessCtrl.createAtManager(); try { const result = await atManager.requestPermissionsFromUser(context, permissions); // 检查授权结果(0:授予,-1:拒绝) const allGranted = result.authResults.every(status => status === 0); if (allGranted) { promptAction.showToast({ message: '摄像头/麦克风权限已授予', duration: 2000 }); } else { promptAction.showToast({ message: '部分权限被拒绝,H5音视频功能可能受限', duration: 2000 }); } } catch (err) { console.error('敏感权限申请失败:', err); promptAction.showToast({ message: '权限申请异常,请重试', duration: 2000 }); } } // 日期格式化工具(可选,用于H5时间参数传递) /** * 格式化日期为YYYY-MM-DD格式 * @param addDay 天数偏移量(如1表示明天,-1表示昨天) * @returns 格式化后的日期字符串 */ export function formatDate(addDay: number = 0): string { const date = new Date(Date.now() + addDay * 86400000); // 1天=86400000ms const year = date.getFullYear(); const month = ('0' + (date.getMonth() + 1)).slice(-2); // 月份0-11,补0至2位 const day = ('0' + date.getDate()).slice(-2); // 日期补0至2位 return `${year}-${month}-${day}`; } (二)WebView 核心组件封装(WebViewH5Component)封装一体化 WebView 组件,集成 H5 加载、权限申请、调试功能,支持状态同步:import { webview } from '@kit.ArkWeb'; import { common, Permissions } from '@kit.AbilityKit'; import { requestSensitivePermissions } from '../utils/Utils_h5'; // 导入上述工具函数 @Component export struct WebViewH5Component { // 接收父组件参数 @Prop h5Url:string @Link isShowWebView:boolean // WebView控制器实例 private webController: webview.WebviewController = new webview.WebviewController(); // 需申请的敏感权限列表(根据H5功能调整) private sensitivePermissions:Permissions[] = ['ohos.permission.CAMERA' , 'ohos.permission.MICROPHONE']; context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; // 组件即将显示:初始化调试、申请权限 async aboutToAppear() { // 1. 启用WebView调试(Chrome DevTools可访问) webview.WebviewController.setWebDebuggingAccess(true); console.info('WebView调试已启用,Chrome访问:chrome://inspect'); // 2. 检查并申请敏感权限(摄像头/麦克风) await requestSensitivePermissions(this.context,this.sensitivePermissions) } build() { // if (!this.isShowWebView) return; Column({ space: 0 }) { // 1. 导航栏:标题 + 关闭按钮 Row({ space: 10 }) { Text('H5应用') .fontSize(18) .fontWeight(FontWeight.Bold); Button('关闭') .width(80) .height(30) .onClick(() => { this.isShowWebView = false }); } .padding(16) .width('100%') .backgroundColor('#f5f5f5'); // 2. Web组件:加载H5并配置核心功能 Web({ src: this.h5Url, controller: this.webController }) .width('100%') .height('100%') .domStorageAccess(true) // 开启localStorage/sessionStorage .databaseAccess(true) // 开启Web SQL数据库 .fileAccess(true) // 开启文件访问 // 允许文件URL跨域访问 // 3. 监听H5权限请求:传递系统权限结果 .onPermissionRequest((event) => { if (!event) return; this.getUIContext().showAlertDialog ({ title: 'H5权限请求', message: '当前H5应用需要访问摄像头/麦克风,是否允许?', primaryButton: { value: '拒绝', action: () => { event.request.deny(); // 拒绝H5权限 console.info('用户拒绝H5权限请求'); } }, secondaryButton: { value: '同意', fontColor: '#007AFF', action: () => { // 授予H5请求的所有资源权限 event.request.grant(event.request.getAccessibleResource()); console.info('用户同意H5权限请求'); } }, cancel: () => event.request.deny() // 取消即拒绝 }); }) } .width('100%') .height('100%'); } } (三)权限配置文件(module.json5)按鸿蒙规范配置所有必需权限,确保系统正常识别:{ "module": { "package": "com.example.webviewh5", "name": ".entry", "mainAbility": "EntryAbility", "requestPermissions": [ // 1. 基础权限:H5加载必需 { "name": "ohos.permission.INTERNET", "reason": "$string:internet_reason", // 在string.json中定义:"internet_reason": "访问网络以加载H5应用资源" "usedScene": { "abilities": ["EntryAbility"], "when": "always" } }, // 2. 敏感权限:H5音视频功能必需 { "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason", // "camera_reason": "允许H5应用调用摄像头进行视频互动" "usedScene": { "abilities": ["EntryAbility"], "when": "always" } }, { "name": "ohos.permission.MICROPHONE", "reason": "$string:microphone_reason", // "microphone_reason": "允许H5应用调用麦克风进行语音输入" "usedScene": { "abilities": ["EntryAbility"], "when": "always" } } ] } } (四)父组件调用示例(集成 WebViewH5Component)通过状态管理控制 WebView 组件显隐,同步 H5 加载结果:import { WebViewH5Component } from '../components/WebViewH5Component'; @Entry @Component struct MainPage { // 控制WebView显隐 @State isShowWebView: boolean = false; // H5应用地址(替换为实际地址) private targetH5Url: string = 'https://edu.huaweicloud.com/roadmap/harmonyoslearning.html'; onClose(){ this.isShowWebView = false; // 关闭WebView } build() { Column({ space: 20 }) { // 触发按钮:打开H5应用 Button('打开H5应用') .width(200) .height(40) .visibility(!this.isShowWebView?Visibility.Visible:Visibility.Hidden) .onClick(() => { this.isShowWebView = true; }); // 加载WebView组件(条件渲染) if (this.isShowWebView) { WebViewH5Component({ h5Url: this.targetH5Url, isShowWebView: this.isShowWebView, }); } } .width('100%') .height('100%') .justifyContent(FlexAlign.Center); } } 0.5 方案成果总结(一)功能层面:通过一体化组件封装,解决 H5 加载、存储、音视频权限三大核心问题,H5 应用功能完整性提升至 95% 以上;domStorageAccess、fileAccess 等配置默认开启,H5 存储功能失效问题彻底解决。(二)开发层面:调试功能前置启用,配合 Chrome DevTools,H5 排错时间缩短 60%;权限工具函数与组件封装减少重复代码,开发效率提升 50%,避免因权限配置错误导致的反复调试。(三)用户体验层面:权限申请通过弹窗明确告知用途,用户知情权提升;H5 加载状态提示、关闭按钮等交互优化,操作步骤从 “多组件切换” 简化为 “一键打开 - 操作 - 关闭”,用户操作效率提升 40%,误操作率降低 70%。
  • [技术干货] 鸿蒙离线包技术,让商品详情页首屏加载快人一步
    1. 首屏加载的"堵点"用户打开商品详情页时,APP需要完成一系列操作:向服务器请求HTML/JSON数据;加载远程图片、视频等资源;渲染页面布局(比如轮播图、价格、规格选择)。如果网络差(比如大促期间基站拥塞)或服务器响应慢,这些步骤会变慢,导致用户看到"白屏"或"转圈圈"。2. 离线包的"救场"逻辑​​离线包​​是将首屏所需的​​关键资源(HTML、CSS、JS、图片)提前打包​​,存储在本地(手机存储或鸿蒙分布式缓存)。用户打开页面时,优先加载本地资源,同时后台请求服务器更新数据,实现"本地资源兜底+在线数据更新"的双保险。对鸿蒙5来说,离线包的优势更明显:​​鸿蒙分布式缓存​​:支持跨设备共享缓存(比如用户在手机上下载的离线包,平板可以直接用);​​原子化服务轻量化​​:离线包体积更小(仅包含首屏必要资源),下载更快;​​ArkTS声明式UI​​:渲染效率更高,配合本地资源减少重排重绘。二、鸿蒙5实现离线包加速的核心技术鸿蒙5为离线包加速提供了三大关键技术支撑,新手需要重点掌握:1. 资源预打包:离线包的"制作配方"鸿蒙5支持将首屏资源(如图片、样式、基础JS逻辑)打包成.hap格式的离线包(HarmonyOS Application Package)。这个包可以随APP安装时自动下载,或在用户首次访问时静默下载到本地。2. 分布式缓存:让离线包"跨设备共享"通过鸿蒙的@ohos.distributedCache接口,离线包可以存储在分布式缓存中。用户用手机打开商品页时,离线包会缓存到手机;用平板打开时,系统会自动从手机的缓存中"拉取"离线包,无需重复下载。3. 本地资源优先加载:首屏"秒开"的关键鸿蒙5的ArkUI框架支持​​本地资源优先渲染​​——页面加载时,先检查本地是否有离线包资源,有则直接使用;没有再请求服务器。同时,后台异步更新离线包,保证下次打开时是最新版本。三、实战案例:某电商商品详情页的离线包优化以某母婴电商的商品详情页为例,我们来看看如何用鸿蒙5的离线包技术实现首屏加速。     步骤1:识别首屏关键资源首屏需要的资源包括:静态图片(商品主图、品牌LOGO);基础样式(CSS文件);核心JS逻辑(价格计算、规格选择);骨架屏(加载时的占位图,提升用户感知)。 ​​注意​​:非首屏资源(如详情页底部的推荐商品、用户评价)不打包到离线包,避免包体积过大。 步骤2:制作离线包(.hap文件)在鸿蒙DevEco Studio中,通过"原子化服务"项目生成离线包。关键配置如下:// 项目配置文件(module.json5) { "module": { "name": "product_detail_offline", "type": "atomicService", // 原子化服务类型 "srcEntrance": "./ets/pages/Index.ets", // 首屏入口 "resources": [ "resources/base/media/product_logo.png", // 品牌LOGO "resources/base/media/skeleton.png", // 骨架屏 "resources/base/css/detail.css" // 首屏样式 ], "distribution": { "deliveryWithInstall": true // 安装APP时自动下载离线包 } } } 步骤3:代码实现:本地资源优先加载以下是商品详情页的核心代码(ArkTS),展示如何优先加载本地离线包资源:// 商品详情页入口(Index.ets) import resourceManager from '@ohos.resourceManager'; import promptAction from '@ohos.promptAction'; @Entry @Component struct ProductDetailPage { @State productData: any = null; // 在线数据(用于更新) @State isLoading: boolean = true; // 加载状态 aboutToAppear() { // 1. 优先加载本地离线包资源(骨架屏+本地图片) this.loadLocalResources(); // 2. 后台请求在线数据(异步更新) this.fetchOnlineData(); } // 加载本地离线包资源 loadLocalResources() { // 获取分布式缓存中的离线包资源 let context = getContext(this) as common.UIAbilityContext; let resourceManager = context.resourceManager; // 加载本地图片(商品主图) let imageSource = $r('app.media.product_logo'); // 对应resources/base/media下的图片 // 加载骨架屏(本地占位图) let skeletonSource = $r('app.media.skeleton'); // 渲染本地资源到页面 // (实际开发中用Image组件显示图片,用骨架屏组件显示占位) } // 异步请求在线数据(更新首屏内容) fetchOnlineData() { fetch('https://api.example.com/product/123') .then(response => response.json()) .then(data => { this.productData = data; this.isLoading = false; // 数据加载完成后隐藏加载状态 }) .catch(err => { promptAction.showToast({ message: '网络异常,使用本地缓存' }); }); } build() { Column() { // 加载状态:显示骨架屏(本地资源) if (this.isLoading) { SkeletonLoader() // 自定义骨架屏组件(使用本地图片) .width('100%') .height(500) } // 数据加载完成后:显示在线内容 else { Image(this.productData.imageUrl) // 在线图片(可能加载慢,但首屏已用本地图兜底) .width('100%') .height(400) Text(`¥${this.productData.price}`) .fontSize(30) .fontWeight(FontWeight.Bold) } } .width('100%') .height('100%') } }步骤4:分布式缓存同步(跨设备加速)为了让用户在平板、折叠屏等其他鸿蒙设备上也能快速加载,需要将离线包缓存到分布式缓存中。代码示例:// 分布式缓存工具类(CacheManager.ets) import distributedCache from '@ohos.distributedCache'; export default class CacheManager { // 缓存离线包资源到分布式缓存 static async cacheOfflineResources() { let cache = await distributedCache.getCache('product_detail_cache'); // 假设从服务器下载了离线包zip文件,路径为'/data/account/cache/offline_package.zip' let file = await fileio.open('/data/account/cache/offline_package.zip', fileio.OpenMode.READ_ONLY); let fileContent = await fileio.read(file, fileio.FileSize.ALL); await cache.put('offline_package.zip', fileContent); await fileio.close(file); } // 从分布式缓存获取离线包资源 static async getCachedResources() { let cache = await distributedCache.getCache('product_detail_cache'); return await cache.get('offline_package.zip'); } }四、效果验证与优化1. 测试工具:鸿蒙性能分析器使用DevEco Studio的"性能分析器"(Performance Analyzer),可以查看首屏加载时间、资源加载耗时等指标。优化后,目标是将:首屏白屏时间从4.2秒缩短至1秒内;首屏完整渲染时间(FCP)从4.2秒缩短至1.5秒内。2. 常见问题与解决​​离线包体积过大​​:只打包首屏必要资源(建议控制在5MB以内),非首屏资源通过懒加载加载;​​缓存更新不及时​​:设置离线包版本号(通过module.json5的versionName字段),版本升级时自动更新;​​跨设备缓存不同步​​:通过distributedCache的事件监听(on('update'))感知缓存变化,主动同步。五、新手入门:3步掌握离线包加速如果你是刚接触鸿蒙的新手,建议按以下步骤实践:1. 学基础:理解离线包与分布式缓存阅读鸿蒙官方文档:原子化服务开发指南;学习@ohos.resourceManager和@ohos.distributedCache接口的使用(DevEco Studio自带API文档)。2. 动手练:用DevEco Studio创建原子化服务新建"原子化服务"项目,勾选"生成离线包"选项;模仿案例代码,实现一个简单的"商品详情页",优先加载本地图片和样式;用手机/模拟器测试,观察首屏加载时间变化。3. 做项目:优化真实电商场景选择一个电商APP(如淘宝、京东),分析其首屏加载慢的问题;尝试用鸿蒙5的离线包技术改进,对比优化前后的性能数据;参与鸿蒙生态的"开发者挑战赛"(如HDC大会的命题赛),积累实战经验。总结首屏加载慢是电商APP的"老大难"问题,而鸿蒙5的离线包技术通过​​资源预打包+分布式缓存+本地优先渲染​​,为这个问题提供了高效的解决方案。对新手来说,关键是掌握"识别关键资源→制作离线包→优先加载本地资源→跨设备同步缓存"的流程,并通过动手实验验证效果。此文为转载文章:需看原文,访问一下链接原文链接:https://blog.csdn.net/qq_52190890/article/details/148532112  
  • [问题求助] M2281-QL,通过对打包后的rpm文件,进行调试算法包签名后,下载进行算法安装,提示证书校验失败,请同步计算机时间后再尝试安装,已经同步过时间了,一样报错
    提示证书校验失败,请同步计算机时间后再尝试安装,各位有遇到过没,怎么解决的
  • [问题求助] 请问我用DevEco Studio开发了一款APP(基于ArkTS语言),如何将华为云IOT物联网平台的设备属性上传至此APP中呢?
    网上找到的教程几乎都是用的安卓系统来开发此APP,根本找不到基于鸿蒙系统的,有没有大佬尝试过啊?
  • [技术干货] harmony-cordova如何快速Android APP和Ios APP生成原生态鸿蒙APP
    harmony-cordova摘要cordova是美国Apache基金会下的移动端跨平台开源项目,目前并不支持HarmonyOS next版本,但是在鸿蒙三方库中心的harmony-cordova主要用于鸿蒙版跨平台研发,特别是原Android和Ios的cordova项目,无需投入任何研发即可轻松生成鸿蒙版APP。背景知识Android是谷歌旗下的操作系统,由于制裁原因,华为已不能使用Android操作系统,从HarmonyOS Next版本之后,华为手机也慢慢将不再兼容安卓APP,原安卓APP,如果继续要在华为手机上用,必须适配鸿蒙操作系统,说适配是好听的,真实情况是在HarmonyOS next操作系统上全部重新研发,不是简单的适配工作,原Android的代码已一无是处了,这样势必增加研发成本。对于大厂这些都是小case了,但是对于中小企业在新的操作系统投入研发,投入的时间成本和资金势必难以接受,另外由于HarmonyOS是一个新的生命,社区支持不够成熟,人才短缺很多中小企业就会望而生畏了。为此我推荐cordova混合研发,只有cordova才是真正的混合研发免费且开源,调用原生态API,一次研发满足安卓、Ios和鸿蒙操作系统。对于市场上流行的开源项目,我可以好不夸张的说只有cordova,没有之一了。国内也有也有一个开发框架,托管了APP的打包工作,虽然也是打着免费的口号,确强制集成了不该集成的SDK,以至于在上架的时候无法满足应用市场的要求和国家法律的要求,因为要说明这些SDK的作用是什么,但是很多开发者就不知道集成有这个SDK,因此隐私政策写不好而不能上架,因为盈利性公司不是基金会,不会提供免费的午餐。我们能够理解,这里我就不明说了。因此对于用心运营的APP的企业,我推荐混合式研发,也不要装X全部使用原生研发,后面维护和升级拿石头砸自己脚。鸿蒙原生开发原生鸿蒙研发支持ArkTS和C/C++语言。并不支持Java,Java的同学可能比较难过,其实也不用担心,看我接下来的分析,ArkTS是华为在TS语言上的进一步优化的后开发语言,不同于TS语言,学起来并不难,只需要几分钟看看就可以上手了,当然这是对于之前熟练的掌握了Java、Js或C/C++的基础上,说实在的如果有了前面的基础TS无需单独学习,直接就可以上手,如果使用native c/c++就不同了,C/C++语言会使很多开发者心里发怵,以致于不敢轻易创建native C++项目,所以有一个部分开发者只能使用ArkTS开发原生鸿蒙APP了,但这样就失去了优势,只能开发更上层应用性的内容,涉及框架或者底层的开发就无法胜任了.harmony-cordova就是使用C/C++研发的,cordova的插件也是C/C++研发的,只有涉及到鸿蒙UI层的必须使用ArkTS了。所以是两者结合开发的,harmony-cordova所涉及的技术方案,我这里不过多的说明,大家只要会用就可以了。接下来说一下harmonyOS吧,HarmonyOS 内核并不是Linux内核,虽然支持C/C++研发,但是并不是现存所有的Linux的开源项目都可以集成到HarmonyOS上的,在加上DevEco采用的是CMake编译,如果原Linux的开源项目是Makefile编译的,要移植到HarmonyOS上,也并非易事,需要Linux C/C++开发的熟手才可以做到,并非入门级别的就可以胜任。如果原Linux下的开源项目,源文件数量少,可以直接拷贝源码集成,如果原Linux下的开源项目文件众多,编译复杂,就需要使用交叉编译移植到HarmonyOS上,为什么要移植Linux开源项目呢?因为大多项目都会依赖Linux的动态库so,所以要进行移植,如果不移植很多C/C++程序就很难开发。但是并不是所有的Linux的开源项目都可以移植的,因为HarmonyOS并不是Linux内核,使用的编译器也不是gcc,所以Linxu下面的so之间互相依赖,因此在Harmony OS上有些so无法移植。另外Linux下面的C/C++的程序和HarmonyOS也有差异,HarmonyOS也预制集成了类似Linux下的so,虽然有预制so,但是并不是所有的函数都可以使用,因为接口并不全,特别是一些涉及到内核的调用和Linux并不一样。综上所述,在HarmonOS平台上,使用native c/c++研发框架类的har,则需要更多的C/C++开发经验,这方面的人才会更少。因此您在网上看到最多的都是ArkTS开发的。harmony-cordova为什么要研发鸿蒙版cordova,公司研发harmony cordova是因为公司内的APP原使用cordova框架研发,很遗憾的是Apache基金会不支持,所以我们公司就自己研发了,研发好以后首先使用在我们公司自己的产品上,1.0版本首先满足了我们公司自己需要插件,后面会慢慢升级以兼容大部分cordova插件。自定义插件,很多Android项目或者Ios项目,集成了自定义插件,例如每个手机厂商的推送功能,都是自定义插件研发的,这里插句话,不要集成第三方的统一推送的SDK,会让你的APP由于隐私政策审核起来出现很多的问题,所以建议集成所有手机厂商自己的推送SDK,因为手机厂商并不多,集成也没有太多的工作。还有OSS对象存储等都需要自定义插件,harmony-cordova也集成了一些常用的自定义插件。如果您的项目中有自定义插件,需要使用harmony-cordova的,就需要开发者支持了。Android移植鸿蒙步骤1,打开DevEco创建项目,选择Empty Ability进入下一步,填写必要信息,这里要注意,bundle name 先填写com.example.myapplication,也就是保持默认不变,因为在没有cordova.crt证书的情况下,cordova鸿蒙版要求bundle name必须为com.example.myapplication,主要用于研发测试,如果开发测试完成要修改bundle name上架鸿蒙应用市场,请联系开发者申请cordova.ert证书,或者事先联系开发者提供技术服务。2,项目创建成功后,复制原有Android studio的工程assests/www目录下面的所有文件到鸿蒙工程entry/src/main/resources/目录下,注意直接复制原andriod工程www目录下的文件,不包含www。3,复制原android工程res/xml目录下的config.xml文件到鸿蒙工程entry/src/main/resources/目录下。4,打开DevEco studio的Terminal终端,进入工程目录,执行 ohpm install harmony-cordova 安装本插件。5,打开鸿蒙工程文件entry/src/main/etx/pages/Index.ets文件,修改代码如下:import { MainPage, pageBackPress, pageHideEvent, pageShowEvent } from 'harmony-cordova/Index';  @Entry  @Component  struct Index {    onPageShow(){      pageShowEvent(); //页面显示通知cordova    }      onBackPress() {      pageBackPress(); //拦截返回键由cordova处理      return true;    }    onPageHide() {      pageHideEvent(); //页面隐藏通知cordova    }      build() {      RelativeContainer() {        MainPage(); //webview首页index.html      }      .height('100%')      .width('100%')    }  }6,打开鸿蒙工程文件/entry/src/main/ets/entryAbility/EntryAbility.ets文件,修改onCreate函数如下import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';      import { hilog } from '@kit.PerformanceAnalysisKit';      import { window } from '@kit.ArkUI';      import { webview } from '@kit.ArkWeb';      import { setSchemeHandler } from 'harmony-cordova/Index';...onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {webview.WebviewController.initializeWebEngine();//webview引擎初始化setSchemeHandler();//设置webview schemehilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}7,鸿蒙混合研发,也许您会增加其他page页面,不一定应用的首页为cordova webview(index.html)的首页,例如应用增加了鸿蒙的原生的启动页面,包含首页弹窗,同意隐私政策后,然后再从启动页面进入cordova的页面,这样避免在用户没有同意隐私政策的情况下,初始化cordova sdk,因为初始化cordova sdk,系统读取了设备的网络状态,因为国内相关法律规定,在用户没有同意隐私政策的情况下,不允许读取设备的网络标识。8,做以上代码修改后,鸿蒙的移植已经完毕,可以使用模拟器或者真机进行编译和测试了。Ios移植鸿蒙步骤如果您的项目有android和Ios的工程,请参考android项目移植项目的鸿蒙下,如果您的项目没有andriod工程,只有Ios工程,请使用如下方法移植,移植时大部分内容和安卓一样,只是复制的文件的路径不一致,以下只介绍不同部分,相同部分请参考android移植步骤。1,复制Xcode的Ios工程目录下的Staging/www目录下的所有文件到鸿蒙工程entry/src/main/resources/目录下。 2,Xcode工程的config.xml文件在Staging目录下,Xcode工程的该文件不能直接被鸿蒙版cordova使用,需要进行转换,该文件主要记录的是插件的名称和初始化的类,因为鸿蒙版是根据android的config.xml进行插件初始化的,因此需要将Xcode工程config.xml转为安卓的config.xml,请将Xcode工程使用node加入安卓平台,系统会自动生成android版的config.xml。然后将文件复制到鸿蒙版工程的entry/src/main/resources/下。附加说明:本人认为使用cordoca跨平台研发,一般至少都会包含android和ios两大平台,很少只有ios平台,没有android平台的,所以大部分移植鸿蒙参考android移植步骤,后续升级SDK会兼容Ios工程的config.xml,无需转换就可以使用。新项目,一次开发适用于andriod、Ios和Harmony三大平台由于cordova官方当前并不支持HarmonyOS平台,使用node无法直接将HarmonyOS加入到cordova,也无法直接安装插件到HarmonyOS,因此对于新项目要一次开发满足三大平台的话,建议先通过node加入Android和Ios平台和安装插件,后续研发可以使用Android studio研发和调试,待研发成功后,然后再在Xcode和DevEco做跨平台适配。Xcode适配请参考cordova的官方文档,HarmonyOS适配请参考以上Android的移植步骤。特别说明当前版本不支持使用者自定义插件研发,如果该版本没有包含您要使用的插件,或者您的项目中有Android或Ios的自定义插件,需要移植到HarmonyOS平台,请您和本开发者联系,获取技术支持。使用鸿蒙版cordova sdk在开发测试阶段务必将bundle name修改为com.example.myapplication,如果将bunlde name改为正式的Id,鸿蒙版cordova sdk会读取entry/src/main/resources/目录的cordova.crt证书文件,用于验签,如果该文件不存在,启动应用后,应用会闪退。如果应用的bundle name为com.example.myapplication,鸿蒙版 cordova sdk会跳过验签,不检测cordova.crt文件。但是上架鸿蒙应用市场,必须将bundle name改为正式的id,所以请联系开发者申请cordova.ert证书,另外由于操作系统之间的差异,虽然保持了cordova的插件接口不变,但是返回值会有所调整,后续文档会逐步完善,在使用本插件跨平台研发时请联系开发者提供技术服务。                                                               
  • 学习手机开发
    需要学习手机开发,建议学习哪些课程?
  • [分享交流] 备案倒计时
    工信部将在2024年4月1号开始将打击未备案已上市的APP、小程序、快应用,还未备案的小伙伴赶紧行动起来!你是否正为自己的APP、小程序、ICP备案或快应用备案而苦恼?你需要加急处理,但又不知道该如何操作?别担心,我们将为你提供详细的指导和解决方案。在当今数字化时代,APP、小程序、ICP备案和快应用备案已经成为许多企业和个人不可或缺的一部分。但是,备案过程可能会非常复杂和耗时,这可能对你的业务产生负面影响。因此,加急处理备案变得至关重要。 让我们来看看APP和小程序备案。APP和小程序备案是确保你的应用或小程序符合相关规定和法律要求的方式。 要加急处理APP或小程序备案,你可以首先确保提交备案所需的所有文件和信息都是完整的和准确的。你可以与服务商联系以了解是否有加急处理的选项。ICP备案是指互联网信息服务提供者在工信部门备案,确保你的网站合法经营和符合相关规定。 如果你需要ICP备案加急处理,你可以提前准备好备案所需的所有材料,并咨询备案服务机构是否有加急处理服务。最后,我们来讨论快应用备案。快应用备案是确保你的快应用符合相关规定和要求的过程。 想要加急处理快应用备案,你可以详细了解备案所需的步骤和要求,或者咨询我们以了解加急处理的可行性。无论是APP、小程序、ICP备案还是快应用备案,加急处理都是提高效率和确保你业务顺利开展的关键步骤。通过仔细准备所需材料,与备案服务机构沟通,并了解各个备案过程的要求,你可以在短时间内完成备案。不要让备案成为你业务发展的瓶颈,抓住加急处理的机会,让你的应用、小程序或网站尽快上线吧!云市场直达:云擎技术(广州)有限公司_商家店铺_电话_邮箱_云商店-华为云 (huaweicloud.com)
  • [问题求助] 如何制作APP
    数据上传到iot平台,怎么根据这些数据制作APP啊