You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Godot中实现应用自动更新?附尝试代码求助

Godot安卓应用自动更新实现方案(基于GitHub + HTTPRequest)

可行流程

  • 版本校验:从GitHub仓库存储的版本文件(比如version.txt)拉取最新版本号,和本地已安装版本对比
  • 下载APK:版本不一致时,从GitHub Releases下载对应版本的APK安装包
  • 触发安装:调用安卓系统的安装逻辑,引导用户完成更新

你的代码问题分析

  1. HTTPRequest复用冲突:同一个HTTPRequest节点同时处理版本请求和下载请求,会覆盖之前的请求状态,导致下载逻辑失效
  2. 下载配置时机错误:http.download_file应该在发起下载请求前设置,而不是请求完成后才赋值
  3. 路径与系统适配错误:安卓系统不支持Windows本地路径,且OS.shell_open无法直接触发APK安装,需要调用安卓原生Intent
  4. 版本号对比不严谨:从网络获取的版本号可能包含换行符,直接对比会导致判断错误

修正后的实现代码

首先,确保你的项目已开启安卓权限:在project.godot中添加

[android]
permissions = "WRITE_EXTERNAL_STORAGE, REQUEST_INSTALL_PACKAGES"

然后是节点脚本(建议使用两个HTTPRequest节点,一个处理版本校验,一个处理APK下载):

extends Control

@export var installed_version = "1.2"
@onready var version_check_http = $VersionCheckHTTPRequest
@onready var apk_download_http = $APKDownloadHTTPRequest

# GitHub上的版本文件地址
var version_url = "https://raw.githubusercontent.com/GPGamer98/tpc/main/version.txt"
# GitHub Releases的APK下载模板(替换成你的实际地址)
var apk_download_url_template = "https://github.com/GPGamer98/tpc/releases/download/%s/tpc_%s.apk"

func _ready():
    version_check_http.request_completed.connect(_on_version_check_completed)
    # 启动版本检查
    version_check_http.request(version_url)

func _on_version_check_completed(result, response_code, headers, body):
    if response_code != 200:
        print("版本检查失败,HTTP状态码:", response_code)
        return
    
    # 去除版本号中的空白字符(换行、空格等)
    var latest_version = body.get_string_from_utf8().strip_edges()
    print("当前版本:", installed_version, ",最新版本:", latest_version)
    
    if installed_version != latest_version:
        print("发现新版本,开始下载...")
        # 拼接APK下载地址
        var apk_url = apk_download_url_template % [latest_version, latest_version]
        # 设置下载路径(安卓外部存储的Download目录)
        var save_path = OS.get_external_storage_dir() + "/Download/tpc_" + latest_version + ".apk"
        # 配置下载请求
        apk_download_http.download_file = save_path
        apk_download_http.request_completed.connect(_on_apk_download_completed)
        apk_download_http.request(apk_url)

func _on_apk_download_completed(result, response_code, headers, body):
    if response_code != 200:
        print("APK下载失败,HTTP状态码:", response_code)
        return
    
    var save_path = apk_download_http.download_file
    print("APK已下载到:", save_path)
    # 调用安卓原生Intent触发安装
    _trigger_apk_install(save_path)

func _trigger_apk_install(file_path):
    # 构建安卓安装Intent
    var intent = Intent.new()
    intent.set_action(Intent.ACTION_VIEW)
    var uri = Uri.from_file(file_path)
    # 适配安卓7.0及以上的文件访问权限
    uri = FileProvider.get_uri_for_file(get_tree().get_root(), "com.your.package.name.fileprovider", uri.get_file())
    intent.set_data_and_type(uri, "application/vnd.android.package-archive")
    intent.add_flags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    intent.add_flags(Intent.FLAG_ACTIVITY_NEW_TASK)
    # 启动安装界面
    OS.get_context().start_activity(intent)

额外注意事项

  • 安卓7.0及以上需要配置FileProvider,否则无法访问下载的APK文件,需要在安卓项目的AndroidManifest.xml中添加对应的provider配置
  • 测试时确保设备允许安装未知来源应用
  • 可以添加下载进度显示,通过HTTPRequest的request_progress信号实现

内容的提问来源于stack exchange,提问作者GP_Gamer98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:42:53