联想桌面助手接入攻略

news2024/11/14 22:06:46

产品接入文档

1.产品介绍

1.1 产品功能介绍

  联想桌面助手,是针对Windows用户的桌面开放平台产品,该产品致力于为用户提供更便捷、更高效的PC服务,同时为开发者提供有效触达用户的方式。

  官方下载体验地址:  联想电脑_电脑管家_弹窗拦截_杀毒软件_垃圾清理__一键驱动管理__联想官方客服__联想电脑管家官网_-

  • 组件展示

1)桌面组件默认展示在桌面右侧区域,支持展开/收起,默认为展开态;

2)组件支持拖拽位置、调整排序,增删组件;

3)组件左键单击可以支持调起浏览器/客户端(已安装);

注意:当前的跳转(浏览器/客户端)均不支持直接跳转至单纯引导下载客户端的官网/直接下载客户端,此跳转需要承接组件必要的产品功能延展;

  • 组件编辑

组件右键支持“个性化编辑”,该编辑态支持产品的核心交互,由于位置有限,需秉持简洁克制的设计理念

  • 组件库(展示态)

1)组件上架至组件库内,支持在组件库内任意选择组件,并添加至组件展示区;

2)组件支持选择尺寸小/中/大;

  • 组件库2(针对强客户端依赖型产品)

1)针对强客户端依赖产品:支持预先引导安装客户端,安装成功后方可正常添加组件至展示区;

2)选择该方案的组件方,需要确保客户端支持静默安装;

注意:选择该方案的组件方要保障后续客户端升级发版需要兼容小组件;

1.2 产品接入流程

1)商务接洽请发邮件至:guanjiafuwu@lenovo.com

2)邮件标题:接入桌面助手平台_****(组件名称)_开发者名称 _联系方式

3)邮件内容:

  • 组件服务功能详述
  • 产品原型/demo

4)以下内容需如实填写:

内容详细要求示例
组件名称根据组件提供的服务,提供组件名称名称长度不超过6个字符单地天气
组件副标题简明扼要说明组件提供的服务描述长度不超过18个字符查看某地的天气状况
是否需要断网展示组件是否支持断网状态下继续使用单地天气--不支持
是否需要预先下载组件是否需要预先下载安装完成,才可以使用部分组件需要引导用户先进行安装,再使用单地天气--不需要
组件尺寸组件支持大中小,三种尺寸三种尺寸,可以任选其一,也可以都支持单地天气--支持大、中、小三种尺寸
组件默认展示尺寸组件在组件库需要有默认展示尺寸单地天气--默认展示小尺寸
是否存在跳出调起浏览器组件是否支持点击跳转,打开浏览器页面进行更多操作需提供跳转的url 注意:此处不允许直接跳转至下载客户端引流页面单地天气--支持跳转 https://weather.lenovo.com.cn/
是否包含收费服务用户使用过程中,是否存在收费服务单地天气--否
是否需要强制安装客户端用户需要提前安装客户端,才可以使用组件服务请谨慎选择此选项,可能造成用户添加意愿降低的可能性,建议强依赖客户端的产品选择单地天气--否

设计接入文档

1. 设计规范概述  

1.1 桌面布局

小组件在电脑桌面右侧优雅的展示,用户可以非常方便的将小组件添加至桌面。并且用户可以根据自己的使用习惯和喜好,对小组件进行自定义排序。

1.2 设计原则

若要创建出色的小组件,在产品定义和设计小组件时,需要遵守以下原则:

> 简单明了

用户可以快速查看信息,最大限度发挥小组件的价值。若用户想要了解更丰富的细节信息或更深入的交互,只需单击该小组件即可。

> 聚焦内容

提供此组件最核心的功能信息,通常应专注与一个主要任务或场景。

> 保持新鲜

组件的展示信息需要不断的更新,若一层不变则无法吸引用户的注意和长久使用的兴趣。

> 注意内容与组件大小的关系

创建或切换不同组件时候,不应只是简单的放大缩小,而应在大组件时考虑展示更多内容,小组件需要精简概括。

2. 组件设计规范

2.1 设计尺寸

联想桌面助手小组件支持1*1、1*2、2*2三种尺寸,分为小、中、大三种规格。开发者可以根据小组件信息和所需展示的功能,选择合适的尺寸进行设计。
1*1 小组件:150*150px(宽*高)
2*1 中组件:320*150px (宽*高)
2*2 大组件:320*320px (宽*高)

举例:「单地天气 」小组件

2.2 适配尺寸

因小组件采用的是自适应布局,在不同分辨率的设备屏幕下,小组件的显示尺寸会相应变化。
我们列出了在不同设备屏幕上实际显示的尺寸,供设计师参考。(无需单独输出设计方案,设计和验收时注意不同分辨率下显示是否正常即可)

举例:分辨率为1366*768,系统推荐显示100%的场景下,小组件缩放比例为100%

举例:分辨率为1920*1080,系统推荐显示150%的场景下,小组件缩放比例为125%

2.3 内容区域

各尺寸组件的内容必须保证在以下红色区域内,即小尺寸:118*130px,中尺寸:280*130px,大尺寸:288*300px。
此区域为最大边界值,若内容较少时,则在红色区域内居中显示,设计者需始终保证版面布局平衡,视觉美观。

举例:「搜索框」和「同花顺股票」中组件,内容不同边距不同

2.4 圆角

各尺寸组件的圆角半径均为12px的平滑圆角。

2.5 投影

各尺寸组件的均采用统一的投影高度。
颜色:#000000 14%;透明度;X:0;Y:2;模糊:21

2.6 文字

2.6.1 字体

为了视觉上的美观及统一,中文、英文和数字均采用 — 微软雅黑

2.6.2 字重

组件可使用的字重为Regular和Bold。
当标题类字号超过16px时,建议使用Bold字重,正文和辅助文字建议使用Regular字重,通过字重突出层级关系,让信息更清晰。设计者需根据实际内容进行字重选择。

2.6.3 字号

字号大小决定了信息的层级和主次关系,通过合理有序的字号设计,让组件信息清晰易读、层次分明。

以下表格为示例,不做具体的字号规定,设计者需根据实际组件的信息内容,进行字号和字重选择。

2.6.4 字色

通过字体的颜色变化,来增强组件的视觉层级。

2.7 颜色

联想桌面助手的小组件支持多种色彩,色彩应该可以作为提升整个小组件视觉属性的一种重要手段,但是它一定不能喧宾夺主,影响内容本身。
我们列出了常用的底板色彩,为渐变色上深下浅的垂直渐变,供参考。设计师也可根据产品调性进行调整,需始终保持色彩过渡自然,避免出现饱和度过高或过低的色彩,与整体融合协调。

选择背景色、图像和内容时,需遵循WCAG 2.1 无障碍指南,确保有足够的颜色对比度,以确保可读性和可访问性。
AA级别中正常文本的对比度要符合4.5:1,大文本(18px以上)的对比度要符合至少3:1;AAA级别中正常文本的对比度要达到4.5:1,大文本对比度要符合至少7:1。

举例:现有组件配色和样式参考

2.8 布局样式

不同尺寸的组件有不同的布局样式,但是内容在容器内至少要保留20%的空白空间,利于阅读。

3. 组件库设计规范

3.1 打开方式

组件库是所有小组件的聚合,可以快速浏览组件的卡片样式、切换展示的尺寸、添加或删除桌面组件等操作。

支持两种打开组件库的方式:

当用户需要添加小部件时,可以很方便的从桌面小组件中,找到组件库的入口。
1) 鼠标右键,选择“整理全部组件”,可进入组件库

2) 点击“+”icon,可进入组件库

3.2 交互行为

进入组件库后,点击小组件左上角的“+”按钮,即可在右侧区域添加预览;切换“小、中、大”button后,可进行展示大小的实时调整;

点击小组件的“一”按钮,即可删除预览。最后点击“完成”button,或空白区域,即可退回桌面。

3.3 缩略图提交规范

需提供该组件各尺寸规格的缩略图,SVG格式,不加投影,圆角度数12,以便预览展示。
小组件缩略图:150*150px(宽*高)
中组件缩略图:256*120px (宽*高)
大组件缩略图:150*150px(宽*高)

4. 右键编辑规范

4.1 打开方式

右键选择编辑此组件,卡片翻转,显示编辑框,此编辑框尺寸固定为320*320px。
卡片翻转的动画效果请与线上保持一致。

4.2 交互行为

右键编辑状态下,请不要使用复杂交互的方式和过深的操作路径,尽量保持操作的简洁性。
注意:内容不可超出框体。

技术接入规范

1.客户端框架简介

1.1 加载流程

  • 桌面助手主程序(Browser进程)负责加载主框架H5
  • 主框架H5通过主框架的插件获取组件的H5列表,并加载所有的组件H5,
  • 主框架负责注入pcmjssdk
  • 主框架有自己的插件进程
  • 每个组件有自己的插件进程,不需要Native支持的组件没有插件进程(譬如天气组件)

1.2 相关技术

  • 使用CEF的框架,最新版本使用Chromium92内核(管家5.0.60之前的版本使用Chromium84内核)
  • 助手框架负责管理所有的显示模块,包括 模块加载、拖动、大小、右键、设置、管理等
  • 所有的C++插件都在独立的插件进程中里加载,和主框架进程隔离,使用IPC通讯

1.3 框架图

2 插件调用流程

  • 框架负责H5和插件的双向通信
  • 组件支持Native的能力,只能通过sdk的接口window.pcmjssdk.asyncSendIPCMessage 进行访问, 调用流程如下图
  • 支持组件的插件给H5发送通知, 通知的流程如下图(后半部分), C++的通知不支持返回值

3.组件目录结构

3.1 简介

管家的安装包会带一份默认的模块包,缓存目录如果不存在模块包,则使用默认的包覆盖

桌面助手框架的包结构和子模块目录结构一致

3.2 目录结构

桌面助手的缓存目录为:C:\ProgramData\Lenovo\devicecenter\extends

3.2.1 extends目录

modules目录为所有的所有的组件目录, 此目录受管家的保护模块保护

cefcache cef的缓存目录,由浏览器引擎生成

3.2.2 extends/modules

modules.json的描述参考文档:组件列表

desktopmainframe 桌面助手主框架

DesktopAssistant.exe 桌面助手的主程序

子目录下是每个模块的 $appid$

3.2.3 extends/ $appid$

config.ini 里面目前只有version这个字段,表示当前模块已经安装并且正在使用的版本

$version$目录:和config.ini 里的version对应,包含此版本里所有的资源模块,桌面助手会加载此版本下的模块

3.2.3.1 extends/ $appid$/$version$

module.json: 此版本的信息,具体参考组件列表

native: 此模块依赖的native插件,提供Native的能力。 包括插件依赖的相关库、exe、资源等

h5: 本地的H5界面,此目录下必须有index.html作为入口, 桌面助手的框架会加载此h5页面

previewimg: 此模块的预览图, 目前支持大中小三种图, 文件名固定为:small.svg, medium.svg,big.svg,要求必须是矢量图

4.组件列表

modules.json是缓存的组件列表,服务器请求成功后会更新此列表

4.1根节点字段

字段名称类型描述
version字符串版本号的规则,譬如:1.0。 后续备用,
preview_img预览图的地址譬如:https://ldc-fast.lenovo.com.cn/desktopassist/modules/客户端根据此地址
按照规则拼出预览图的地址: $appid+$previeimgversion+previewimg+$图片名称
图片格式: SVG图片名称规则:小预览图:small.svg中预览图:medium.svg大预览图:big.svg

4.2 modules数组的字段:

字段名称类型描述
字段名称类型描述
app_id字符串模块的唯一标识
version字符串版本号
url字符串模块的H5地址,如果为空,则会尝试读取缓存目录下的h5/index.html
package字符串包的下载地址,暂定为zip格式
package_sha256字符串验证下载的包是否完整(必须小写)
support_sizeint此模块支持的大小, 位操作 1:小 2:中  4:大. 譬如:如果大中小都支持,这位1+2+4=7
default_sizeint默认的大小 必须是 1,2或者4, 否则认为无效
title字符串模块的标题
sub_title字符串模块的子标题
default_showint此模块是否默认显示,  0表示默认不显示,1 表示默认显示
support_editint此模块是否支持编辑, 默认为0, 0表示不支持, 1表示支持
extends字符串扩展字段,备用
orderint模块排序
force_updateint是否强制升级,默认为0,1表示强制升级, 0不强制升级
app_typeintapp的类型,默认为0。 此类型暂定为枚举类型,方便后续扩展

0 表示标准组件。1.20之前的版本只支持 0

1 表示必须依赖软件的安装程序 1.20之后的版本支持
install_infoobject安装程序的信息,如果app_type为0,忽略此字段

具体参考下面表格的install_info 描述
presetint默认为0, 是否为预置的组件,小红点依据此字段来显示
small_appobject小程序相关信息,如果没有此字段,则表示此组件不支持小程序
此字段只支持助手1.80及之后的版本

install_info 安装包信息

字段名称字段类型描述
min_version字符串本地安装需要的最小版本

譬如5.1 表示如果本地版本不小于5.1则不需要再安装,否则需要安装
guid字符串安装包的唯一标识的guid,注册表里的键值

譬如: {A9861883-31C5-4324-BD9A-DC9527EEB675}_is1是管家的注册表键值
package字符串安装包的下载地址
package_sha256字符串验证下载的包是否完整(必须小写)
package_cmdline字符串安装包的命令行参数
app_title字符串安装包显示的App标题
intervalint安装包下载安装大概需要的时间, 默认为20秒

small_app 小程序相关字段(字段如果没有设置,则走默认值)

字段名称字段类型默认值描述
url字符串h5/app/index.html小程序的H5地址,如果为空,则会尝试模块读取缓存目录下的h5/app/index.html
如果没有配置此字段,并且没有 h5/app/index.html 这个文件,则此组件不支持小程序的调用
icon字符串program.ico小程序运行的ICON图标,小程序运行时任务栏的图标
默认会从previewimg目录下读取
widthint400程序启动的宽度
heightint700程序启动的高度
resizeableint0是否支持Resize, 1表示支持 0表示不支持
此字段只有在联想电脑管家5.0.120及之后的版本才支持

5. 组件开发

  • 三方开发的组件需要遵守桌面助手的开发规范。
  • 组件开发至少需要一个组件显示的H5页面, H5支持本地和云端页面,云端页面在无网情况下会加载失败
  • 组件支持本地Native的能力,需要按照组件Native的规范开发C++的插件来支持

5.1 开发环境搭建

1)基础环境(可使用开发工具进行开发环境搭建),此工具支持:

  • 允许开发者编辑组件目录下的文件
  • 使用本地组件列表,临时禁用服务器列表的请求
  • 包含了两个示例的demo, H5组件 和 支持Native能力的组件

2)安装最新版本(5.0.50及以上)的联想电脑管家,管家里包含最新版本的桌面助手, 下载地址:联想电脑管家

3)运行开发者工具进行环境配置,配置完成后请重启桌面助手

组件目录为%ProgramData%\Lenovo\devicecenter\extends\modules, 以下用%DESKTOPASSISTMODULES%代替

5.2 线上H5组件

开发者工具中示例

%DESKTOPASSISTMODULES%\modules.json 里添加组件(如下),具体的字段描述参考4.2

{

          "app_id": "baidugushitong",

          "default_show": 1,

          "default_size": 2,

          "extends": "",

          "force_update": 0,

          "order": 1600,

          "package": "",

          "package_sha256": "",

          "sub_title": "股市信息",

          "support_edit": 1,

          "support_size": 7,

          "title": "股市信息",

          "url": "https://gushitong.baidu.com/",

          "version": "1.0"

      }

url填写H5页面的地址

如果组件是一个线上的H5组件,不依赖本地Native的插件, 此时重启桌面助手,就可以在组件库里添加并显示此组件。

5.3 本地H5&C++组件

开发者工具中,以demomodule为例

%DESKTOPASSISTMODULES%\modules.json 里添加组件(如下),具体的字段描述参考4.2

{

           "app_id": "demomodule",

           "default_show": 1,

           "default_size": 2,

           "extends": "",

           "force_update": 0,

           "order": 1600,

           "package": "",

           "package_sha256": "",

           "sub_title": "demomodule",

           "support_edit": 1,

           "support_size": 7,

           "title": "demomodule",

           "url": "",

           "version": "1.0"

 }

将demomodule.zip 解压后,放到%DESKTOPASSISTMODULES%\app_id目录下(app_id和上一步添加的app_id相同, 此例为demomodule),此目录结构说明:

config.ini 配置当前组件的版本,目录下有此版本号的目录来存放相关的组件文件, 内容为

[config]

version=1.0 # 1.0和上一步添加的version信息相同

1.0/module.json 为当前版本的组件配置(必须和上一步添加的信息一致)

1.0/previewimg 里面存放组件库里显示的预览图,格式固定为svg,(小组件缩略图名称:small.svg, 中组件缩略图名称:medium.svg, 大组件缩略图名称:big.svg)

1.0/h5 本地的h5页面,如果目录里有index.html,则识别此组件为本地H5页面,否则会使用url的配置显示线上的H5(如果url也为空,则识别为无效组件,组件库不显示)。H5开发参考:桌面助手H5开发 - PC软件产品 - XPaas Confluence (lenovo.com)

1.0/native 放置native的插件和插件依赖的模块

可以以demomodule为参考,扩展业务组件的开发

重启启动桌面助手,就可以在组件库里添加并显示此组件

5.4 线上H5&C++组件

和本地H5&C++组件开发流程一致, 只需要要url设置为线上的H5就可以

需要保证1.0/h5目录里没有index.html (否则会识别为本地的H5来显示)

5.5 插件发布

开发者平台在开发中,目前由人工处理

将modules\$appid\$version\目录下文件全部打包成zip文件,上传至人工处理

譬如:打包的zip里的内容如下:

6. 组件H5开发

针对小组件H5开发,桌面助手框架提供了一些交互上的能力

页面目前支持三种大小,大小由框架来设置, 建议组件的H5实现自适应大小(譬如使用媒体查询)

H5的sample可以参考demomodule的H5代码

  • 组件大小、是否支持编辑由组件的配置来支持
  • 组件的拖动由框架来支持
  • 组件的编辑只支持大尺寸的显示,尺寸由框架来控制

6.1 pcmjssdk

桌面助手框架会注入页面jssdk, 实现了H5和C++双向通讯的能力

window.pcmjssdk提供以下方法:

接口名称描述备注实例:
registerNativeNotify注册插件的通知第一个参数是需要注册通知的模块,譬如:NEWPLUGIN_HELLOWORLDPLUGIN_ 表示注册HelloWorld插件的通知
第二个参数为接受通知的回调函数
window.pcmjssdk.registerNativeNotify('NEWPLUGIN_HELLOWORLDPLUGIN_',(category,content)=>{console.log('notify:',category)});
asyncSendIPCMessage异步调用插件的接口此接口会在Browser进程里加载IPC通讯的插件,并启动子进程来加载指定的插件
category:插件方法名, category 的规则需要以NEWPLUGIN_+插件库的文件名开头,下划线隔开 譬如:NEWPLUGIN_PLUGINDEMO_ADD
messageboday: 插件的方法参数
pluginName插件的名称, :默认为空.。 如果不为空插件名称优先使用此
className: IPC通讯的唯一标识, 默认为空。 为空的情况会使用插件名称作为唯一标识
remoteModule:IPC通讯进程的exe名称,默认为WSPluginHost.exe
window.pcmjssdk.asyncSendIPCMessage('NEWPLUGIN_HELLOWORLDPLUGIN_TESTNOTIFY', '1').then((e) => {
console.log('testIPCNotify2:', e)
})

6.2 框架接口

事件名称事件描述备注
window.onModuleEditFinish点击编辑完成需调用此事件编辑完成,子组件需要调用框架的onModuleEditFinish方法来通知框架
window.pcmjssdk.
reportBigdata.reportShowBigdata
上报大数据show类型action、label、params 均有数据需求人员定params 最多接受5个参数,
无参数可不传举例:window.pcmjssdk.reportBigdata
.reportClickBigdata('xxxx', 'xxx', [{'key': 'xxx', 'value': xxxx},{'key': 'xxx', 'value': xxxx}]);
window.pcmjssdk.
reportBigdata.reportClickBigdata
上报大数据click类型
window.pcmjssdk.
reportBigdata.reportReportBigdata
上报大数据report类型

6.3 window.open

框架会拦截此方法并上报相关的大数据,业务端可以调用此接口打开浏览器, 譬如:window.open('http:///www.baidu.com?s=1')

如果电脑安装了联想浏览器,则默认会使用联想浏览器打开,否则会使用默认浏览器打开

需要注意:使用浏览器打开指定的页面只能使用window.open,否则无法上报数据

6.4 页面接口

页面根据业务需要,实现相关的接口,来实现相关的业务功能

事件名称事件描述备注
window.onModuleEdit右键此组件,点击编辑,会触发此页面的函数举例:window.onModuleEdit = ()=>{ 组件内部逻辑处理 }
右键编辑,框架会调子组件的onModuleEdit方法来通知子组件
如果组件不支持编辑,可以不需要实现此接口
window.onModuleShow桌面助手显示会触发此事件
window.onModuleHide桌面助手隐藏会触发此事件
window.onModuleSetSize切换组件大小会触发此事件举例:window.onModuleSetSize = (evt) => { //size 1 小 2 中 4 大 console.log('onModuleSetSize:', evt, evt.size);}
window.onModuleActive桌面助手激活会触发此事件
window.onModuleDeactive桌面助手失去激活会触发此事件

6.5 扩展接口

根据业务的需要,框架会在升级的版本里提供一些扩展的接口

1. 获取模块信息:

可以通过jssdk的方法获取当前模块的一些信息

调用方法:window.pcmjssdk.getModuleInfo()

返回:{version:'1.0', appid:''appid, extends:"extends"}

可以通过返回值获取当前模块的appid和version等信息

sample:window.pcmjssdk.getModuleInfo().version  获取当前模块的版本

框架支持的版本:所有

2. 上报打开组件客户端的大数据

组件打开客户端,需要调用框架的接口来上报大数据

调用方法:window.parent.postMessage({ method: 'onOpenComponentClient',name: window.name }, '*')

框架支持的版本:1.20

6.6 组件拖动

框架会hook鼠标的点击消息来完成页面的拖动,组件可以根据业务的需要来禁用此拖动。 譬如在编辑页面、文本框输入页面、button等

此功能只在桌面助手框架1.20及以上的版本支持

1)控件添加样式disablecomponentdrag, 譬如<div class="disablecomponentdrag"></div>

框架会递归查找父组件的样式,如果有此样式,则禁用拖动

2)页面实现window.allowDragComponet, 返回false表示禁用。 框架在点击时调用此方法来决定是否拖动, 参数为鼠标点击MouseEvent

示例:

window.allowDragComponet = (evt) = > 
{
     return (evt.pageY < 40); 
}

6.7 组件编辑

  • 组件如果支持编辑,则样式需要实现统一的反转动画,编辑态组件的大小和大组件的大小一致
  • 页面需要实现window.onModuleEdit, 在此方法里实现反转动画和页面的切换
  • 编辑完成后,需要调用框架接口:window.onModuleEditFinish,做页面的切换

具体可以下载 5.3章节的demomodule.zip

代码示例:

html 代码
<div id="content">展示页</div>
<div id="setting">编辑页</div>

css代码
#setting {
  transform: rotateY(0deg);
}
.rotate {
  transition: 0.3s;
  transform: rotateY(90deg);
}
.rotates {
  transform: rotateY(90deg)!important;
}

js代码
// 反转动画dom
  var settingDom = document.querySelector('#setting');
  var contentDom = document.querySelector('#content');
  settingDom.className = 'rotates';
  // TODO 用户点击了'编辑此小组件'
  window.onModuleEdit = (evt) => {
    settingDom.style.transition = '0.3s';
    contentDom.className = 'rotate';
    setTimeout(() => {
      // TODO 因为rotate存在过度动画0.3s 所以给setting的行为也延迟0.3s
      settingDom.className = '';
    }, 300);
  };
  //调用设置完成的接口
  function finishEdit() {
    settingDom.className = 'rotates';
    setTimeout(() => {
      contentDom.className = '';
      contentDom.style.transition = '0.3s';
      setTimeout(() => {
        window.onModuleEditFinish(); // 关闭大窗口
        contentDom.style.removeProperty('transition');
      }, 300);
    }, 300);
  }

6.8 小程序相关的接口

助手1.80及以后的版本支持小程序相关的接口,jssdk增加了window.pcmjssdk.smallapp对象

在使用小程序相关的方法时,需要先判断此对象是否存在

譬如:

if (window.pcmjssdk.smallapp) { window.pcmjssdk.smallapp.asyncStart()}

接口名称接口描述备注
asyncStart启动组件的小程序组件的页面,可以在用户点击组件的时候调用
启动当前组件的小程序不需要传入参数,框架会负责加载组件对应的小程序页面
window.pcmjssdk.smallapp.asyncStart()
asyncStartWith带参数启动小程序助手1.130版本开始支持

使用前可以先判断window.pcmjssdk.smallapp&&window.pcmjssdk.smallapp.asyncStartWith
启动小程序的时候带上data参数, 小程序启动后可以使用此参数做业务逻辑
使用可以参考最新的小程序开发文档
asyncCheckIsRunning检测组件的小程序是否在运行例如:
var running = await window.pcmjssdk.smallapp.asyncCheckIsRunning();
if (running == "1") {console.log('is running')}else {console.log('not running')}
asyncNotify小程序和组件的通知在小程序的页面调用,会通知组件。 在组件里调用,会通知小程序
调用方法:window.pcmjssdk.smallapp.asyncNotify('notify data')
接收通知使用pcmjssdk注册回调的方法,注册的第一个参数为:FRAMEWORK_NOTIFY_DATA_FROM_SMARTAPP
例如:window.pcmjssdk.registerNativeNotify('FRAMEWORK_NOTIFY_DATA_FROM_SMARTAPP',
(category, content) => { var data = JSON.parse(content).data });

6.9 本地存储接口

助手1.100及以后的版本支持本地存储的接口,jssdk增加了window.pcmjssdk.localStorage对象

此接口的存储和组件相关,同一个组件和组件的小程序可以共享存储的数据

在使用此接口前,需要先判断此对象是否存在

if (window.pcmjssdk.localStorage) { ...}

接口名称接口描述备注
setItem存储数据暂时不支持存储大于100K的数据
window.pcmjssdk.localStorage.setItem('name','张三')
getItem获取存储的数据例如:
var name =  window.pcmjssdk.localStorage.getItem('name')

7. C++插件开发

可以参考HellowWorldPlugin.cpp, 实现了最基础的管家插件

C++插件必须使用MT(静态链接)的编译选项 (管家框架不会安装VC运行时)

插件只支持32位的

桌面助手的框架提供了H5和C++插件的双向通信, 调用的demo可以参考文档里的demo

71. 接口定义

接口名称描述注意事项
pcm_plugin_ininitialize插件的初始化
此接口会在H5第一次调用插件方法的时候执行
使用回调函数实现C++给H5发送通知
参考7.2
pcm_plugin_actionH5调用window.pcmjssdk.asyncSendIPCMessage 时框架会调用此函数
response会返回给H5
参考7.2
pcm_plugin_buffer_allocate分配插件内存保持和demo一致就可以
pcm_plugin_buffer_free释放插件内存保持和demo一致就可以
fn_pcm_plugincallback回调函数定义回调不支持response,可忽略此参数

7.2 注意事项

  • pcm_plugin_action方法和fn_pcm_plugincallback 回调的的action为字符串, 字符串必须以NEWPLUGIN_$PLUGINNAME$开发, 其中$PLUGINNAME$表示插件的动态库文件名,譬如:NEWPLUGIN_HELLOWORLDPLUGIN_ADDONE
  • pcm_plugin_action所有的接口请求为同步调用,调用返回前会penning其他的接口请求, 建议长时间的操作在新的线程执行,并通过callback的方式通知到H5
  • pcm_plugin_action 的返回值为0时,表示成功, 非0都表示执行错误。 非0时, H5需要在promise的.catch 里做错误处理

7.3 示例代码

#include "stdafx.h"
#include <string>
#include <thread>

#ifdef __cplusplus
extern "C" {
#endif

using fn_pcm_plugincallback = int(*)(LPCSTR action, const char* content, _Out_ char** response);
fn_pcm_plugincallback g_callback = NULL;

__declspec(dllexport) char* pcm_plugin_buffer_allocate(int len)
{
	return new char[len];
}

__declspec(dllexport) void pcm_plugin_buffer_free(char* ptr)
{
	if (ptr)
	{
		delete[] ptr;
	}
}

__declspec(dllexport) int pcm_plugin_ininitialize(LPCSTR paramter, fn_pcm_plugincallback callback)
{
	g_callback = callback;
	return S_OK;
}

//返回值0 表示成功,其他作为错误码,都认为是失败
__declspec(dllexport) int pcm_plugin_action(LPCSTR action, LPCSTR paramter, char** response)
{
	//新插件的定义 必须以NEWPLUGIN_HELLOWORLDPLUGIN 开头
	std::string content;
	int result = S_OK;
	if (strcmp(action, "NEWPLUGIN_HELLOWORLDPLUGIN_HELLO") == 0)
	{
		content = "hello world";
	}
	else if (strcmp(action, "NEWPLUGIN_HELLOWORLDPLUGIN_ADDONE") == 0)
	{
		int ret = atoi(paramter);
		content = std::to_string(++ret);
	}
	else if (strcmp(action, "NEWPLUGIN_HELLOWORLDPLUGIN_ERROCODE") == 0)
	{
		result = 110;
		content = u8"未知异常";
	}
	else if (strcmp(action, "NEWPLUGIN_HELLOWORLDPLUGIN_TESTNOTIFY") == 0)
	{
		std::thread([]() {
			if (g_callback)
			{
				g_callback("NEWPLUGIN_HELLOWORLDPLUGIN_NOTIFYJS", "Hello Notify", NULL);
			}
		}).detach();
	}
	if (content.length() > 0)
	{
		auto lenght = content.length() + 1;
		//这个分配的内存,会有调用方调用pcm_plugin_buffer_free 进行释放
		*response = new char[lenght];
		memcpy_s(*response, lenght, content.c_str(), lenght);
	}
	return result;
}

#ifdef __cplusplus
}
#endif

7.4 windows客户端安装

由于业务调整,桌面助手新的组件暂时不再接入windows客户端的安装

如果联想软件商店没有上架,客户端安装流程请参考7.4.1

如果联想软件商店已经上架的软件,客户端安装流程请参考7.4.2

7.4.1 助手框架支持的安装流程

只有在助手1.20及以上框架才能够支持

此流程需要按照8.1的文档提供完整的材料

添加组件的流程图如下:

需要注意:

  1. 目前的安装程序只支持exe格式,提交的exe和提交的sha256必须匹配
  2. 提交新的安装包不能更新服务器上一个版本的包,否则可能会使部分用户因为sha256不匹配,导致安装失败
  3. 检测客户端是否安装是从注册表里找提交信息GUID, 注册表路径:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
  4. 如果提交的信息里有最小版本的要求,则GUID下必须有DisplayVersion, 框架会依赖此字段做版本比较
  5. 调用安装程序会依赖安装程序以及所有的子进程全部退出,才识别为安装结束,不建议静默安装的时候拉起常住的子进程
  6. 1.50之前的框架,默认是30分钟超时检测, 1.50及之后的版本在超时前,会每隔30秒做一次注册表检测,如果注册表匹配就识别为安装成功,不再等待子进程的退出
  7. 助手框架会监控软件的注册表(上述定义的注册表),注册表一旦移除,则识别为软件被卸载, 此组件会被自动移除

7.4.2 基于软件商店的客户端的安装流程

依赖联想软件商店的客户端安装能力,只有在助手1.60及以上框架才能够支持

此流程提供8.7.1到8.7.4的内容, 可以参考9.9的注意事项

软件商店客户端的上架流程:

注册流程:

个人开发者:https://open.lenovomm.com/developer/doc?id=1560519371051511809

企业开发者:https://open.lenovomm.com/developer/doc?id=1557313917878046722

创建应用(已包含下条):https://open.lenovomm.com/developer/doc?id=1557313917878046722

静默安装说明: https://open.lenovomm.com/developer/doc?code=silentInstall

若已注册并上传应用的开发者想新增静默安装功能,请通过更新应用的方式进行(应用内添加对应功能,并通过开放平台填写参数,或联系客服添加)

8.上线准备

目前暂时不支持开放平台直接后台提交,需要将相关的信息提交给管理人员 :guanjiafuwu@lenovo.com

8.1需要的材料

1.组件支持尺寸(大、中、小)和相关尺寸的图片,此图片必须是svg格式的矢量图,保证在各种DPI下显示的效果

2. 默认显示的尺寸,大中小选择一个

3.是否支持编辑

4.组件标题(在组件库里显示)

5.组件描述(在组件库里显示)

6.组件包的zip文件(如果是线上的H5组件并且不依赖C++的插件,则不需要提供)

   1.格式必须是zip格式,不能够加密

   2.zip包根目录的内容包括 native和h5目录 (根据组件需求,两个目录至少有一个),具体可以参考 demomodule.zip

   3.zip包里不需要previewimg和module.json,用户添加组件的时候会自动生成

   4.native目录下如果有C++的插件,在上生产环境之前会做安全扫描并签联想的数字签名,否则只能使用开发者工具才能够加载

7.如果此组件需要在电脑上安装软件才能使用,需要提供

   1.安装包的下载地址,目前只支持exe的安装包(建议部署到CDN上, 一旦发布不允许再替换包)

   2.安装包的哈希256值

   3.安装包在注册表的里的GUID(譬如:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下的key定义)

   4.静默安装的命令行参数(要求必须支持静默安装)

   5.此软件至少支持的版本(上面注册表下的DisplayVersion),框架会根据此版本对比来决定是否下载安装新的包

   6.安装包的标题 (在需要安装客户端的时候,显示给用户的标题)

   7.安装包下载安装大概需要的时间(秒),组件安装的进度条会依赖此时间

9 注意事项

1.组件使用线上的H5或者本地的H5,至少需要支持一种模式

2.每次更新组件包,都需要重新提交上线申请

3.线上的H5,不能禁用X-Frame-Options

4.H5的组件,图片建议使用svg矢量图,避免出现不同DPI下图片显示模糊的问题

5.组件H5页面禁止使用长期持续的动画(譬如CSS3、svga、svg等),避免较高的CPU功耗占用

6.线上的H5页面建议禁用cache, 否则需要处理断网情况下,页面缓存加载成功情况下的用户体验

7.为了减少电脑功耗,助手在托盘状态(托盘显示,页面隐藏)时,会将非Browser进程的子进程都suspend (所有JS的行为都会被禁用)

8.H5的组件禁止使用WebAssembly

9.从助手的1.60开始支持软件商店的客户端安装。针对8.7,如果已经在软件商店上架,则不需要再提供8.7.1到8.7.4的内容(软件商店的安装包必须支持静默安装)

10.用户没有使用组件的情况下,禁止高CPU的占用,避免较高的功耗使用。组件可以依赖6.4页面激活的通知来处理相关的业务,避免空闲状态的高功耗占用

11. 桌面助手目前只支持win10及以后的系统

12.有C++插件或者本地H5的发布,需要打包成zip格式,打包的内容参考: 联想开放平台

原文地址https://open.lenovomm.com/developer/doc?id=1590256744668172289

联想开放平台地址:联想开放平台

联想开发者专属QQ客服(工作日9:30-18:00):联想开发平台首页右侧悬浮的在线客服聊天入口可直接会话,无需添加好友。也可搜索官方客服QQ号2881414004。

联想应用商店微信公众号:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1701237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于51单片机多功能太阳能充电器设计

1 绪论1.1 本课题研究背景及现状 当代社会随着一些不可再生资源如煤炭&#xff0c;石油等日益减少&#xff0c;使得各国社会经济越来越受能源问题的约制&#xff0c;因此许多国家开始逐渐的实行“阳光计划”&#xff0c;开发洁净的能源如太阳能&#xff0c;用以成为本国经济发…

scala完整笔记-5万字一周入门到精通系列(一)

scala完整笔记-5万字一周入门到精通写在开篇 1.scala学习前一定要具备了解一些java基本知识&#xff0c;无需精通&#xff1b;如果从未接触java&#xff0c;最好熟悉一门编程语言&#xff0c;否则相对还是学习起来相对吃力且很难学懂 2.本篇主要以代码示例为主&#xff0c;很多…

【稳定检索】2024年电子技术、传感器与信号处理国际会议(ETSS 2024)

2024年电子技术、传感器与信号处理国际会议 2024 International Conference on Electronic Technology, Sensors, and Signal Processing 【1】会议简介 2024年电子技术、传感器与信号处理国际会议&#xff0c;作为业内领先的学术交流平台&#xff0c;将汇聚全球顶尖的电子技术…

GpuMall智算云:fofr/cog-face-to-many/cog-face-to-many

通过该镜像创建实例后&#xff0c;点击更多-创建自定义端口 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 输入8188&#xff0c;因为该镜像中的cog-face-tomany监听8188端口&#xff0c;所以必须要填写为8188端口&#xff0c;然后点击确定#au…

基于jeecgboot-vue3的Flowable新建流程定义(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 8、同时可以进行流程的编辑 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)designerData.title "流程设…

如何自建谷歌站点?

自建谷歌站点其实是一个相对简单的过程&#xff0c;主要是指创建一个能够被谷歌搜索引擎索引和搜索的网站 首先要做的自然就是选择一个域名&#xff0c;域名基本就相当于你的门牌号了&#xff0c;你得想一个既好记又能代表你网站内容的名字&#xff0c;注册域名可以去很多网站…

分析训练全球 2k+ 水文站数据,中科院团队发布 ED-DLSTM,实现无监测数据地区洪水预测

随着全球气候变化&#xff0c;洪水灾害正变得愈发频繁。联合国减少灾害风险办公室与比利时鲁汶大学灾害流行问题研究中心联合发布的报告指出&#xff1a;过去 20 年间&#xff0c;全球洪水灾害数量从 1,389 起上升到 3,254 起&#xff0c;增加了超两倍&#xff0c;占到灾害总数…

宝塔面包安装搭建Flarum开源论坛程序 文档教程

一、服务器环境说明 宝塔 7.0.3 或更新版本 Linux Server&#xff08;本文用的是 CentOs 7.4.6 64位&#xff09; Apache 或者 Nginx&#xff08;本文用的是 Nginx 1.16.0&#xff09; MySQL 5.6&#xff08;本文使用 MySQL 5.7&#xff0c;原因请看下方引用&#xff09; PHP 7…

【漏洞复现】WordPress Country State City Dropdown CF7插件 SQL注入漏洞(CVE-2024-3495)

0x01 产品简介 Country State City Dropdown CF7插件是一个功能强大、易于使用的 WordPress 插件&#xff0c;它为用户在联系表单中提供国家.州/省和城市的三级下拉菜单功能&#xff0c;帮助用户更准确地填写地区信息。同时&#xff0c;插件的团队和支持也非常出色&#xff0c…

【wiki知识库】02.wiki知识库SpringBoot后端的准备

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f4c2;打开SpringBoot项目 2.1 导入所需依赖 2.2修改application.yml配置文件 2.3导入MybatisPlus逆向工程工具 2.4创建一个公用的返回值 2.5创建CopyUtil工具类 2.6创建…

06.深入学习Java 线程

1 线程的状态/生命周期 Java 的 Thread 类对线程状态进行了枚举&#xff1a; public class Thread implements Runnable {public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;} } 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用…

设计模式八股文

什么是设计模式&#xff1f; 设计模式是软件开发过程中经常遇到的问题的通用解决方案。类似于前人总结的经验&#xff0c;遇到相似问题的时候有个参考。 设计模式七大基本原则&#xff1f; 单一职责&#xff1a;一个类应该只作一件事情。将功能分为小的独立的单元。开放封闭…

【mysql】更新操作是如何执行的

现有一张表&#xff0c;建表语句如下&#xff1a; mysql> create table T(ID int primary key, c int);如果要将 ID2 这一行的a字段值加 1&#xff0c;SQL语句会这么写&#xff1a; mysql> update T set c c 1 where ID 2;上面这条sql执行时&#xff0c;分析器会通过词…

springboot发送短信验证码,结合redis 实现限制,验证码有效期2分钟,有效期内禁止再次发送,一天内发送超3次限制

springboot结合redis发送短信验证码,实现限制发送操作 前言(可忽略)实现思路正题效果图示例手机号不符合规则校验图成功发送验证码示例图redis中缓存随机数字验证码&#xff0c;2分钟后失效删除redis缓存图验证码有效期内 返回禁止重复发送图验证码24小时内发送达到3次&#xf…

精通C++ STL(二):string类的模拟实现

目录 string类各函数接口总览 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve和resize empty 修改字符串相关函数 push_back append operator insert erase clear swap c_str 访…

spring boot 之 结合aop整合日志

AOP 该切面仅用于请求日志记录&#xff0c;若有其他需求&#xff0c;在此基础上扩展即可&#xff0c;不多逼逼&#xff0c;直接上代码。 引入切面依赖 <!-- 切面 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…

云主机选购指南:如何选择适合自己的云主机

一、认识移动云 移动云是中国移动提供的专业云服务品牌&#xff0c;基于移动云计算技术构建。它实现了云网一体化&#xff0c;确保客户享有安全可控的服务。通过充分利用移动云计算能力&#xff0c;打造了N31X资源布局&#xff0c;结合各省级数据中心&#xff0c;通过专线互联…

基于Vue的前端加载中页面动画——弹跳动画Loading组件的设计与实现

基于Vue的前端加载中页面动画——弹跳动画Loading组件的设计与实现 摘要 随着技术的飞速进步&#xff0c;前端开发的复杂性日益提升。传统的开发方式通常将整个系统构建为一个整体&#xff0c;导致即使是微小的改动或功能的增加也可能引起整体逻辑的变动。为了解决这个问题&a…

【蓝桥杯】国赛普及-

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int…

嵌入式UI开发-lvgl+wsl2+vscode系列:1、资料收集以及Windows下WSL2模拟环境运行示例demo

文章目录 一、前言二、资料收集三、Windows下WSL2上编译运行lvgl的demo程序1、lvgl简介2、lvgl特性3、配置要求4、Windows下vscodewsl2模拟环境搭建4.1、安装vscodewsl24.2、下载获取项目&#xff1a;4.3、安装显卡驱动4.4、下载lvgl并编译运行示例demo 四、最后 一、前言 UI界…