Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity 之通过自定义协议从浏览器启动本地应用程序
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 自定义协议 启动程序

为初学者节省宝贵的学习时间,避免困惑!


前言:

  当今,Web 应用程序已经成为我们日常生活和工作中不可或缺的一部分。然而,有时我们可能需要从 Web 浏览器直接启动本地安装的应用程序,以处理特定的任务或数据。这时候,自定义协议就显得尤为重要和便捷。

自定义协议允许我们定义一种新的 URL 方案,使得浏览器能够识别并直接与本地应用程序进行通信。这种技术不仅提升了用户体验,还增强了 Web 应用程序与本地环境的集成能力,使得用户可以更高效地完成工作任务。

在本文中,我们将探讨如何设置和利用自定义协议来处理特定的 URL,以便从浏览器中打开本地应用程序。我们将介绍如何注册和处理自定义协议,并演示如何在浏览器中触发本地应用程序的启动,以实现无缝的跨平台集成和工作流程优化。



一、注册自定义协议


自定义协议(Custom Protocol)是一种在操作系统级别定义的URL协议,可以让特定的URL模式触发特定的应用程序。通过自定义协议,你可以在浏览器中点击一个链接,然后启动一个本地应用程序。这在开发需要从网页启动本地应用的场景中非常有用,比如启动Unity生成的.exe文件。
@echo off
cd /d %~dp0

@REM echo "%cd%"

:: 创建一个注册表文件并写入头部信息
echo Windows Registry Editor Version 5.00 >regist.reg

:: 创建主键 PrimaryKey,用于自定义协议
echo [HKEY_CLASSES_ROOT\PrimaryKey] >>regist.reg

:: 指定这是一个 URL 协议
echo "URL Protocol"="" >>regist.reg

:: 设置协议的描述
echo @="Primary Key Protocol" >>regist.reg

:: 创建子键 DefaultIcon,用于设置协议的图标
echo [HKEY_CLASSES_ROOT\PrimaryKey\DefaultIcon] >>regist.reg

:: 使用当前目录下的 YourUnityGame.exe 作为图标
echo @="%cd:\=\\%\\YourUnityGame.exe,1" >>regist.reg

:: 创建子键 shell
echo [HKEY_CLASSES_ROOT\PrimaryKey\shell] >>regist.reg

:: 创建子键 shell\open
echo [HKEY_CLASSES_ROOT\PrimaryKey\shell\open] >>regist.reg

:: 创建子键 shell\open\command
echo [HKEY_CLASSES_ROOT\PrimaryKey\shell\open\command] >>regist.reg

:: 设置当协议被调用时执行的命令,将当前目录路径转义,并将第一个参数传递给 YourUnityGame.exe
echo @="\"%cd:\=\\%\\YourUnityGame.exe\" \"%%1\"" >>regist.reg

:: 静默地导入注册表文件
regedit /s regist.reg

:: 删除临时生成的注册表文件
del regist.reg

:: 输出注册成功的提示信息
echo 注册成功

:: 暂停批处理脚本的执行,等待用户按下任意键继续
pause

PrimaryKey为注册表文件中的主键,可以根据你的需要自行填写

YourUnityGame为你的程序名称

创建一个批处理文件(例如register_protocol.bat),将上面的脚本代码粘贴进去。

将YourUnityGame.exe放在与批处理文件相同的目录中。

以管理员身份运行register_protocol.bat,会自动完成协议注册。

在这里插入图片描述

使用命令符regedit命令,打开注册表,在计算机\HKEY_CLASSES_ROOT\PrimaryKey中可以查看到已经注册完成。


二、使用自定义协议打开应用程序


完成自定义协议之后,你可以在浏览器中使用形如:

PrimaryKey://{“param1”:“value1”,“param2”:“value2”,“param3”:“value3”}的URL来启动YourUnityGame.exe

并传递参数{“param1”:“value1”,“param2”:“value2”,“param3”:“value3”}到YourUnityGame.exe程序中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Open Application with Custom Protocol</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            font-family: Arial, sans-serif;
            background-color: #f0f0f0;
        }
        button {
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        }
        button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <button onclick="openApp()">Open YourUnityGame App</button>

    <script>
        function openApp() {
            window.location.href = 'PrimaryKey://{"param1":"value1","param2":"value2","param3":"value3"}';
        }
    </script>
</body>
</html>

点击按钮后会弹出这个窗口,说明你已经成功了,即将打开YourUnityGame 应用程序

在这里插入图片描述


三、在Unity中处理自定义协议传递的参数


当你从自定义协议中获取到参数链接后,通常是一个类似于

PrimaryKey://{“param1”:“value1”,“param2”:“value2”,“param3”:“value3”} 的字符串。

接下来的关键是如何从这个字符串中提取出每个参数的值。

在Unity中,可以通过使用Newtonsoft.Json 库来解析 JSON 格式的参数。

确保在 Unity 项目中导入了 Newtonsoft.Json 库,你可以通过 Unity 的 Package Manager 或手动导入 DLL 文件来实现或在Packages/mainifest.json中添加"com.unity.nuget.newtonsoft-json": “3.2.1”

using Newtonsoft.Json;
using System.Text.RegularExpressions;
using UnityEngine;

[System.Serializable]
public class ProtocolData
{
    public string param1;
    public string param2;
    public string param3;
}

public class ProtocolHandler : MonoBehaviour
{
    string protocolPattern = @"^(?<protocol>\w+)://(?<param>\{.+\})$";

    void Start()
    {
        // 获取启动时的参数
        string[] args = System.Environment.GetCommandLineArgs();

        // 如果有参数
        if (args.Length > 1)
        {
            //"PrimaryKey://{\"param1\":\"value1\",\"param2\":\"value2\",\"param3\":\"value3\"}"
            string protocolLink = args[1];

            // 使用正则表达式匹配自定义协议链接
            Match match = Regex.Match(protocolLink, protocolPattern);

            // 如果匹配成功
            if (match.Success)
            {
                // 获取协议名
                string protocol = match.Groups["protocol"].Value;

                // 获取 {} 中的 JSON 内容
                string jsonContent = match.Groups["param"].Value;

                // 输出协议名和 JSON 内容,方便调试
                Debug.Log("Protocol: " + protocol);
                Debug.Log("JSON Content: " + jsonContent);

                // 使用 Newtonsoft.Json 解析 JSON
                ProtocolData data = JsonConvert.DeserializeObject<ProtocolData>(jsonContent);

                // 现在可以访问 data 中的参数值
                Debug.Log("param1: " + data.param1);
                Debug.Log("param2: " + data.param2);
                Debug.Log("param3: " + data.param3);
            }
            else
            {
                Debug.Log("Received parameter does not match the custom protocol format.");
            }
        }
    }
}

Regex.Match(protocolLink, protocolPattern) 使用正则表达式匹配 protocolLink 中的自定义协议链接。

如果匹配成功 (match.Success),则从 match.Groups[“protocol”] 获取协议名称,从 match.Groups[“param”] 获取 JSON 内容。

使用 JsonConvert.DeserializeObject<>() 方法将 JSON 内容解析为 ProtocolData 类型的对象,然后可以访问其中的参数值。




TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-19 04:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-19 04:34:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-19 04:34:01       82 阅读
  4. Python语言-面向对象

    2024-06-19 04:34:01       91 阅读

热门阅读

  1. 扩展动态数据统计

    2024-06-19 04:34:01       32 阅读
  2. vlcplayer for android 源码编译log打印

    2024-06-19 04:34:01       28 阅读
  3. RSS Channel 元素

    2024-06-19 04:34:01       75 阅读
  4. 事务&AOP

    2024-06-19 04:34:01       30 阅读
  5. 算法刷题笔记 二进制中1的个数(C++实现)

    2024-06-19 04:34:01       35 阅读
  6. 代码随想三刷二叉树篇2

    2024-06-19 04:34:01       37 阅读
  7. QT day4

    QT day4

    2024-06-19 04:34:01      37 阅读
  8. 浅封装BeanUtils,优雅实现List数据copy拷贝

    2024-06-19 04:34:01       37 阅读
  9. 8086/8088计算机寄存器知识详解

    2024-06-19 04:34:01       42 阅读
  10. [qt][报错】[Makefile:1293: moc_widget.cpp] Error 1

    2024-06-19 04:34:01       36 阅读
  11. 【Qt】xml文件节点读取

    2024-06-19 04:34:01       34 阅读