首页/文章/浏览器

(Mac版)终于搞懂了浏览器是怎么唤醒本地应用了

2024-01-15
9264 分钟
...

之前写了一篇Windows版的终于搞懂了网盘网页是怎么唤醒本地应用了的文章, 发表后,直接窜上了综合热榜第一,这是令我没想到的。 传送门:终于搞懂了网盘网页是怎么唤醒本地应用了

然后有些朋友就问了,好奇Mac上应该怎么配置自定义协议来通过浏览器唤醒本地应用。这篇文章我就简单记录一下。

不像Windows在注册表中配置,每个Mac应用都会有一个Info.plist的配置文件,这里还用VS Code来举例子

/Applications/Visual Studio Code.app/Content/Info.plist

这个文件是每个app都会包含的,而自定义打开协议就在这里配置。

<array>
        <dict>
                <key>CFBundleTypeRole</key>
                <string>Viewer</string>
                <key>CFBundleURLName</key>
                <string>Visual Studio Code</string>
                <key>CFBundleURLSchemes</key>
                <array>
                        <string>vscode</string>
                </array>
        </dict>
</array>

这里大家应该都能看懂,是一个数组里套了个字典。通过配置CFBundleURLSchemes这个key,值为vscode就代表了定义了一个vscode的协议。几乎每个应用都会有自己的伪协议。

注:这里纠正一个之前文章的小错误,windows中,基本上每个应用程序安装后都已经注册好了自定义协议。所以在之前windows的文章演示中那个vscode协议早就存在了,我的注册表操作只是把它重写了,在这里纠正一下。

但是仅仅写到这里就可以了吗,肯定不行的。需要执行一下app,在每个app第一次执行的时候,Mac系统都会自己先过一遍整个应用,然后自动把配置添加到系统中,这个是不需要用户去完成的。

所以当你点击运行一次之后,这个协议就被识别然后添加到了系统自定义协议中了。

自己搞一个mac app成本较大(本人也不会)。这里为了方便演示,我用如下流程:

在应用文件夹中复制一份VScode,更名为vs.app,然后重写自定义协议为vs,来用浏览器唤醒。

cp -r Visual\ Studio\ Code.app vs.app

然后进入vs.app的Contents

编辑Info.plist

<array>
        <dict>
                <key>CFBundleTypeRole</key>
                <string>Viewer</string>
                <key>CFBundleURLName</key>
                <string>Visual Studio Code</string>
                <key>CFBundleURLSchemes</key>
                <array>
                        <string>vs</string>
                </array>
        </dict>
</array>

修改string值为 vs,保存。

然后在应用程序中,打开

这个是正常的,损坏了。我这里只是为了演示配置一个vs伪协议,运行一次的原因是为了让系统识别一次,把自定义的vs协议注册到系统中。

随后,我们打开浏览器输入 vs://

点击打开后确认是咱们新添加的这个损坏的程序。

这里我再多说一下怎么查询Mac中的自定义协议,系统中有一个LaunchServices的概念,是负责应用程序的注册启动等相关的内容的。

所以可以通过如下命令来去获取自定义协议信息

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -i "bindings:.*:"

可以列出当前所有的支持协议

刚刚的vs也赫然在列。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
浏览器2025-07-30
浏览器内核到底有哪些?它们各自又有什么区别?
这问题其实很多刚入行的同学经常搞混,所以今天我来一次性讲明白—— 浏览器内核 到底有哪些?它们各自又有什么区别? 说白了,浏览器内核就是浏览器的大脑,分两部分: 渲染引擎(Rendering Engine) :负责网页的排版渲染,HTML、CSS统统交给它。 JS引擎(JavaScript Engine) :处理JavaScript脚本逻辑,比如你点按钮后弹出对话框这种行为。 1)常见浏览器内核盘点 下面我直接列几个主流的浏览器内核,顺...
学习面试
浏览器2025-03-07
浏览器缓存及优化手段
前言 当我们通过url首次访问某个网站的时候,我们如果使用浏览器的工具查看网络请求,会发现有很多http请求,但是当我们下一次再访问时,这些请求都不会发送而是展现在了页面上,而这就是浏览器缓存发挥的作用。 浏览器缓存 浏览器缓存是指将页面长时间不更新的资源缓存到浏览器上,下次访问页面时该部分长时间不更新的资源直接从缓存中获取,从而减少了网络请求次数,提高了页面的加载速度。浏览器的缓存方式主要分为两种: 强缓存 和 协商缓存 ,下面将为大...
学习面试
浏览器2024-12-16
chrome调试工具overrides调试代码
利用Chrome开发者工具断点调试功能调试修改代码,一刷新就什么都没有了,且只能调试JS代码,太尴尬了。 想刷新后,原来修改调试的的代码还在,且JSP、JS、CSS等能调试,那赶快试试下面这种方法吧。 第一步: 在浏览器开发者工具中打开下面的面板sources overrides! 第二步: 打开Select folder for overrides,选择要存放代码的文件夹 第三步: 点击允许访问文件夹,overrides生成刚才选择的...
学习
浏览器2024-09-13
震惊!🐿浏览器居然下毒
发生什么事了 某天,我正在愉快的摸鱼,然后我看到测试给我发了条消息,说我们这个系统在UC浏览器中有问题,没办法操作,点了经常没反应(测试用得iPhone14,是一个h5的项目)。我直接懵了,这不是都测了好久了吗,虽然不是在uc上测得,chrome、safari、自带浏览器等,都没这个问题,代码应该是没问题的,uc上为啥会没有反应呢?难道是有什么隐藏的bug,需要一定的操作顺序才能触发?我就去找了测试,让他重新操作一下,看看是啥样的没反应...
学习
浏览器2024-09-10
深入理解浏览器的事件循环机制
在现代Web开发中,JavaScript作为浏览器中最常用的编程语言,其执行机制深刻影响着Web应用的性能和用户体验。事件循环(Event Loop)作为JavaScript处理异步操作的核心机制,是理解JavaScript执行模型的关键。本篇文章从多个维度去分析事件循环的机制,希望可以帮大家更加深入的了解它。 在讨论事件循环之前,理解浏览器的执行环境是至关重要的。浏览器是一个多线程环境,包含以下主要线程: GUI 渲染线程(GUI R...
学习面试
浏览器2024-09-02
优化浏览器渲染主线程的 api 都有哪些?怎么用?
为了提高浏览器的性能和用户体验,现代浏览器采用了一些技术来优化主线程的执行。主要有: setTimeout 延迟加载 (使用不当可能适得其反) web worker 多线程 (不能操作dom,主要计算密集型的任务) requestIdleCallback 帧空闲时运行 (react18带🔥的,低优先级任务) requestAnimationFrame 每帧都会运行 (主要做动画效果调优) setTimeout 延迟加载非常常见,但是它...
学习面试

评论

请登录后发表评论

去登录
加载评论中...