You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Kotlin KMP Windows桌面应用配置DeepLink及通过安装脚本实现唤起的方案咨询

Kotlin KMP Windows桌面应用配置DeepLink及通过安装脚本实现唤起的方案咨询

我来帮你梳理下在Kotlin KMP Windows桌面应用中配置DeepLink并通过安装脚本实现唤起的可行方案,结合官方文档信息和实际实践经验拆解如下:

一、先明确Windows端DeepLink的核心配置逻辑

官方文档里已经明确:Windows 8及更早版本需要通过修改注册表注册DeepLink协议;Windows 10/11则是在应用包清单(类似Package.appxmanifest这类文件)里声明协议。但Compose Multiplatform本身不支持在KMP项目内部直接配置这些,所以得借助外部工具或自定义脚本完成。

二、用自定义安装脚本实现的具体步骤

如果你想类似Electron那样用安装脚本搞定,这里提供两种常见的实现思路:

1. 针对Windows 10/11的MSIX打包+清单配置

如果你的应用是打包成MSIX格式(Windows现代应用包),可以手动生成或修改包清单文件,添加DeepLink协议声明:

  • 先在打包生成的Package.appxmanifest里添加如下类似配置段(注意替换成你的应用信息和协议名):
<Applications>
  <Application Id="YourKMPApp">
    <Extensions>
      <uap:Extension Category="windows.protocol">
        <uap:Protocol Name="yourappscheme">
          <uap:DisplayName>你的KMP应用DeepLink协议</uap:DisplayName>
        </uap:Protocol>
      </uap:Extension>
    </Extensions>
  </Application>
</Applications>
  • 之后可以用Windows自带的MakeAppx.exe工具重新打包,或者在第三方打包工具(比如官方提到的Hydraulic Conveyor)里配置这个清单片段,它会帮你把协议声明打包进安装包,安装时自动完成注册。

2. 针对全Windows版本的注册表脚本(适合传统exe打包)

如果你的应用是打包成传统exe,那可以写一个.reg注册表脚本,或者用PowerShell脚本在安装时自动写入注册表:

  • 举个PowerShell脚本的例子(替换成你的应用路径和协议名):
# 注册协议到注册表
$protocolName = "yourappscheme"
$appPath = "C:\Path\To\YourKMPApp.exe"

# 写入用户级注册表(无需管理员权限)
New-Item -Path "HKCU:\Software\Classes\$protocolName" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\$protocolName" -Name "(Default)" -Value "URL:Your KMP App Protocol"
Set-ItemProperty -Path "HKCU:\Software\Classes\$protocolName" -Name "URL Protocol" -Value ""
New-Item -Path "HKCU:\Software\Classes\$protocolName\shell\open\command" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\$protocolName\shell\open\command" -Name "(Default)" -Value "`"$appPath`" `"%1`""
  • 把这个脚本和你的exe打包在一起,安装时让用户运行(或者用Inno Setup、NSIS这类安装制作工具,把脚本设为安装步骤自动执行),这样不管是Win8还是Win11,都能完成协议注册。当用户点击yourappscheme://xxx链接时,系统就会唤起你的KMP应用,并且把链接参数传给exe。

三、KMP应用内部处理DeepLink参数的补充

注册好协议后,你还需要在KMP的Windows入口代码里接收并处理DeepLink参数:

  • 在你的Windows端main函数里,可以直接获取命令行参数,示例代码如下:
fun main() {
    val args = Platform.memoryStack.utf8PointerArray(Platform.argc, Platform.argv)
    val deepLinkArg = args.getOrNull(1)?.toKString() // 第二个参数就是DeepLink的完整链接
    if (deepLinkArg != null) {
        // 在这里处理你的DeepLink逻辑,比如导航到对应页面
    }
    // 启动你的Compose应用
    application {
        YourKMPApp()
    }
}

四、简化实现的工具推荐

如果你不想自己写脚本,官方提到的Hydraulic Conveyor是个不错的选择,它可以直接把KMP的Windows应用打包成单文件exe或者MSIX,并且支持在配置里声明DeepLink协议,打包时自动帮你处理注册表或清单的配置,不用手动写脚本,体验类似Electron的打包流程。


内容来源于stack exchange

火山引擎 最新活动