windows平台下,web与app交互方式探索
前言 web与app孰优孰劣暂且不争论,也许一方永远代替不了另一方。一个系统有可能同时包含web和app;web和app紧密配合下,才能给用户更好的体验。web如何将信息传达给app?这就是本文要探索的话题。
web与app交互包括两部分 : 1)web启动app。2) web与app交互数据。
1 web启动app
windows平台可以通过URL Protocol协议启动app。将app的信息写入注册表,web通过该协议就可以启动app,同时也可以传给app参数。其实,注册表已经包含大量该协议了,看下图:
app需要按照规范,写入注册表信息。我写了一个函数,可以方便的完成该功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | const string UrlItemName = "openOfdDesign" ; private void WriteRegUrlProtocol() { string curFullPath = this .GetType().Assembly.Location; try { RegistryKey keyRoot = Registry.ClassesRoot; RegistryKey itemRootKey = keyRoot.CreateSubKey(UrlItemName); itemRootKey.SetValue( string .Empty, UrlItemName+ "Protocol" ); itemRootKey.SetValue( "URL Protocol" , curFullPath); RegistryKey itemDefaultIcon = itemRootKey.CreateSubKey( "DefaultIcon" ); itemDefaultIcon.SetValue( string .Empty, curFullPath+ ",1" ); RegistryKey itemShell = itemRootKey.CreateSubKey( "shell" ); RegistryKey itemOpen = itemShell.CreateSubKey( "open" ); RegistryKey itemCommand = itemOpen.CreateSubKey( "command" ); string cmdValue = string .Format( "\"{0}\" \"%1\"" , curFullPath); itemCommand.SetValue( string .Empty, cmdValue); itemCommand.Close(); itemOpen.Close(); itemShell.Close(); itemDefaultIcon.Close(); itemRootKey.Close(); } catch (Exception ex) { MessageBox.Show( "写注册表程序异常!" +ex.Message); } } |
注册表信息准备好后,web端就可以启动该app。代码很简单:
<div>
<a href="openOfdDesign://action=editOfd&ofdGuid=5041075d-a3d3-462e-b4b2-c3a9cfb18c8d">
启动 OfdDesign
</a>
</div>
启动app时,也可以传给app一些参数。这些参数大小有限制,如果要传入大量数据,需要用到ajax。下文会介绍此方法。
启动app的问题解决了,其实还有大量的细节问题值得我们思考。
如何确保只启动一个app实例?
web端每调用一次就会启动一个app实例,这种情况并不是我们想要的。我们想要的结果是:
a) 如果程序没启动,启动程序,处理传入的参数。
b) 程序已启动,不用启动新的app,现有程序处理传入的参数。
对于 b)如何实现?
我们确实无法控制app只启动一个app,每一次web调用,肯定会启动一个app实例。但是,实例启动后,我们就可以有所作为。假定实例a1已启动,现在启动了实例a2。a2启动后,检测到a1已启动;a2则将传入的参数发送a1,a2立即退出。
两个实例a1和a2之间如何交互?
需要用到两个技术:
1)互斥锁 Mutex;这个比较简单,不再累述。
2) 内存文件;
内存文件其实和磁盘文件没啥区别,只是内存文件不占用磁盘空间,读写速度远超磁盘文件。读写内存文件时,要加锁,否则会出问题。紧接着的问题就是:内存文件的存放结构,怎么知道内存文件是否有数据?解决这些问题并不难,这里就不给出详细的解决方案了。
2 web与app交互数据
web可以通过ajax与app交互数据。app建立一个简单的http服务并不难。使用HttpListener就可以了。下文为启动监听代码:
HttpListener _httpListener;
public bool Start()
{
_httpListener = new HttpListener();
//定义url及端口号,通常设置为配置文件
_httpListener.Prefixes.Add(string.Format($"http://+:{ListenPort}/"));
//启动监听器
_httpListener.Start();
for (int i = 0; i < 2; i++)
{
Task.Factory.StartNew(() =>
{
WaitHttpRequest();
}, TaskCreationOptions.LongRunning);
}
// _httpListener.BeginGetContext(HttpCallback, null);
return true;
}
后记 web和app各有优势,如何扬长避短,是我们常常要思考的问题。为了增强web的功能,老的技术是在浏览器中嵌入ocx;但是这种技术有诸多弊端。新的浏览器已不支持该协议。本文探讨了另一种交互技术,这种技术平台限制小,绝大多数浏览器都能支持,是值得推广的一项技术。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!