背景

毫无疑问,面对一个新的项目需求,我们首先想到的就是web。

确实,web太方便了,基于浏览器对OS的适配,我们可以很快速的实现某个需求的页面UI,而无需考虑OS的兼容差异。

再经过jq、bootstrap、vue等框架(库)的加持,web简直太酷了!

但浏览器(主要是V8)在成全web起飞的同时,由于安全沙箱的先天限制,web应用只能在浏览器的授信范畴内活动,而无法与OS直接通信。

当需要web应用访问本地的摄像头、读卡器、扫码枪、打印机等智能硬件时,总是会显得无能为力。

因此,在开发超市收银、业务大厅、IC卡管理等系统时,我们还是需要传统桌面应用与OS直接通信的那种能力。

模式

按照我们的习惯,还是在web中实现主要的页面UI及业务逻辑,而在需要与OS通信的部分,可以借助于桌面应用来跟OS的API打交道,并将最终结果返回给web。

这样一来,就可以打破浏览器安全沙箱的限制,将web的能力无限延申从而达到与本地OS相互通信的目的。

方案

在上面的图片中,web页面是借助桌面应用来与操作系统进行通信。

我们知道桌面应用和操作系统之间的通信是很简单的,不管是C++、C#或者JAVA都拥有这个能力,主要问题还是web与桌面应用之间的通信方式。

在远古时代,常用的办法有ActiveX、Java Applet和Flash等方式,主要是在web页面中嵌入dll或swf插件,通过这些插件来实现web本身无法做到的事情。

遗憾的是在现代浏览器中,这几种方式都逐渐不被支持,尤其从Chrome45版本以后,原来的NPAPI方式已被淘汰,新的PPAPI方式需要一定的门槛,对普通的web开发人员来说难度不小。

所以,就有很多人想到了另外一种方式,编写一个桌面应用,并在其中添加一个webview控件,就可以模拟成一个简化版的浏览器环境,然后通过js来实现双方的通信。

这种方式实现起来很方便,各种开发语言中都有webview控件,同时还实现了web应用的桌面驻留,使它看起来更像一个桌面应用。

选型

实现web桌面化的技术方案中,目前主流的有以下两种:

  1. Electron:源于Github,是一个使用JavaScript, HTML和CSS等Web技术创建原生程序的框架,文档比较全面,社区也很活跃,发展到目前已经很成熟了;
  2. Cef系列:主要是CefSharp,是面向winForm或wpf环境下,对嵌入式Chromium框架的封装,通过C++/CLI的方式来调用CEF类库,目前的版本更新很频繁,优点是上手简单,跟Chrome的兼容非常好。

以上两种技术方案都有大量的使用者,一般的技术问题都能从搜索引擎找到答案。

尝试

我本人通过对CefSharp的简单封装,实现了一个叫 EDesk 的玩应,主要进度如下:

  1. 屏蔽右键菜单
  2. 自定义首页
  3. Form标题跟随Web标题自动更新
  4. 重写新窗口(target=_blank)
  5. 重写弹窗(alert/confirm)
  6. 快捷键:F5刷新页面
  7. 快捷键:Ctrl + F5强制刷新页面
  8. 快捷键:F11全屏/恢复
  9. 快捷键:F12打开控制台
  10. 自定义UserAgent:EDesk/1.0.0
  11. 增加JS对象注入:EDesk
  12. 增加JS对象自动绑定函数:EDeskReady
  13. 摄像头操作API

下一步计划实现身份证阅读器的操作API,便于在web中实现对身份证的读取、检测以及读取身份证照片的功能。

目前该项目已在gitee上开源,地址:https://gitee.com/itez/edesk

欢迎感兴趣的朋友一起交流。

关于web桌面应用的集成解决方案的更多相关文章

  1. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  2. Atitit 桌面软件跨平台gui解决方案 javafx webview

    Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...

  3. Jmeter+jenkins如何快速搭建接口和性能测试持续集成解决方案-[基于windows篇]

    最近在用Jmeter本来想写一个详细的使用教程,突然看到有前辈已经写好了不错的教程,特此"借花献佛"整理出来分享给大家! Jenkins + Jmeter 构建接口.性能测试持续集 ...

  4. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  5. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  6. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  7. 【转】外部应用和drools-wb6.1集成解决方案

    一.手把手教你集成外部应用和drools workbench6.1 1.         首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...

  8. web桌面程序之图标拖动排序的分析

    在web桌面程序里,图标拖动并重新排序是个比较常见的功能.这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下. 这一功能主要有哪些难点呢?我总结了一下一共有2处难点: ...

  9. Selenium Web 自动化 - 项目持续集成(进阶)

    Selenium Web 自动化 - 项目持续集成(进阶) 2017-03-09 目录 1 背景及目标2 环境配置  2.1 SVN的安装及使用  2.2 新建Jenkins任务3 过程分析 1 背景 ...

随机推荐

  1. 安鸾CTF Writeup SSRF03

    SSRF03 题目URL: http://whalwl.host:2000/ 其中的弯路我就不多说了,直接上解题思路 方法和SSRF02类似都是找内网机器端口,继续用ssrf02 这道题的方法:htt ...

  2. Python小白的数学建模课-18.最小生成树问题

    最小生成树(MST)是图论中的基本问题,具有广泛的实际应用,在数学建模中也经常出现. 路线设计.道路规划.官网布局.公交路线.网络设计,都可以转化为最小生成树问题,如要求总线路长度最短.材料最少.成本 ...

  3. NOIP 模拟 $33\; \rm Hunter$

    题解 \(by\;zj\varphi\) 结论题. 对于 \(1\) 猎人,他死的期望就是有多少个死在它前面. 那么对于一个猎人,它死在 \(1\) 前的概率就是 \(\frac{w_i}{w_i+w ...

  4. Mybatis-Plus入门学习笔记(一)

    本文内容 了解Mybatis-Plus 整合Mybatis-Plus 1.了解Mybatis-plus 1.1.Mybatis-Plus介绍 MyBatis-Plus(简称 MP)是一个 MyBati ...

  5. WPF 中的 Command 命令

    <Window x:Class="CommandDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx ...

  6. 深入浅出Mybatis系列(一)---Mybatis简介

    1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且 ...

  7. 【gdal】创建GeoTiff栅格数据

    1 //定义转换参数 2 private readonly double[] d_transform = { 69.999999999999972, 0.01, 0.0, 44.99999999999 ...

  8. 【REST】使用RestSharp 库消费Restful Service

    使用RestSharp 库消费Restful Service   现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流..NET/Mono下如何消费Restful Serv ...

  9. c++制表符

    1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 //制表符是8个字符,当在一个制表符开始的位置(明白什么位置是 ...

  10. 设计模式<一>

    设计原则1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是针对实现编程. 3.多用组合,少用继承. 一:策略模式,定义了算法族,分别封装起来 ...