如何在Godot中实现应用自动更新?附尝试代码求助
Godot安卓应用自动更新实现方案(基于GitHub + HTTPRequest)
可行流程
- 版本校验:从GitHub仓库存储的版本文件(比如
version.txt)拉取最新版本号,和本地已安装版本对比 - 下载APK:版本不一致时,从GitHub Releases下载对应版本的APK安装包
- 触发安装:调用安卓系统的安装逻辑,引导用户完成更新
你的代码问题分析
- HTTPRequest复用冲突:同一个HTTPRequest节点同时处理版本请求和下载请求,会覆盖之前的请求状态,导致下载逻辑失效
- 下载配置时机错误:
http.download_file应该在发起下载请求前设置,而不是请求完成后才赋值 - 路径与系统适配错误:安卓系统不支持Windows本地路径,且
OS.shell_open无法直接触发APK安装,需要调用安卓原生Intent - 版本号对比不严谨:从网络获取的版本号可能包含换行符,直接对比会导致判断错误
修正后的实现代码
首先,确保你的项目已开启安卓权限:在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
相关产品推荐
相关产品推荐

