Unity编辑器Firebase Storage正常,Android真机上传失败求助
解决方案:Unity Android端Firebase Storage上传无实际文件问题
针对编辑器上传成功、Android真机走到成功分支但后台无文件的问题,从代码逻辑、初始化配置、权限等方面逐一排查解决:
1. 修复任务完成的判断逻辑
当前代码中task.IsCompleted仅表示任务结束,但不代表上传成功(任务取消、异常终止也会触发IsCompleted=true),导致你误以为上传成功。需改用IsCompletedSuccessfully并捕获所有异常情况:
reference.PutFileAsync(path).ContinueWith(task => { if (task.IsCompletedSuccessfully) { Debug.Log("上传成功!"); // 可选:获取下载URL验证上传结果 reference.GetDownloadUrlAsync().ContinueWith(urlTask => { if (urlTask.IsCompletedSuccessfully) { Debug.Log("文件下载地址:" + urlTask.Result); } else { Debug.LogError("获取下载地址失败:" + urlTask.Exception); } }); } else if (task.IsFaulted) { Debug.LogError("上传失败:" + task.Exception); } else if (task.IsCanceled) { Debug.LogError("上传被取消"); } });
2. 修正Firebase Storage初始化配置
初始化时FirebaseStorage.GetInstance的第二个参数需传入正确的存储桶地址(格式为gs://你的项目ID.appspot.com),或直接利用AppOptions中已配置的StorageBucket,避免指定错误地址导致上传无响应:
// 替换原初始化代码,自动使用AppOptions中的StorageBucket配置 storageInstance = FirebaseStorage.GetInstance(app); // 若需手动指定,确保地址正确 // storageInstance = FirebaseStorage.GetInstance(app, "gs://your-project-id.appspot.com");
3. 检查Android权限配置
确保AndroidManifest中添加了网络权限,否则上传请求无法发出:
- 在Unity的
Project Settings > Player > Publishing Settings中勾选Custom Main Manifest - 在生成的
AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4. 改用字节流上传避免文件路径问题
Android平台对临时目录的文件访问可能存在权限限制,PutFileAsync可能无法正确读取文件。跳过本地文件写入,直接上传JSON字节数组:
public void SaveJsonData() { if (UserData.instance.User != null) { string jsonDataTemp = JsonUtility.ToJson(JsonStorage.instance.jsonData, true); byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonDataTemp); reference.PutBytesAsync(jsonBytes).ContinueWith(task => { if (task.IsCompletedSuccessfully) { Debug.Log("上传成功!"); } else if (task.IsFaulted) { Debug.LogError("上传失败:" + task.Exception); } else if (task.IsCanceled) { Debug.LogError("上传被取消"); } }); } else { Debug.Log("NULL"); } }
5. 其他排查点
- 验证Firebase Storage规则:确保规则允许已认证用户上传(测试阶段可临时设置为
allow read, write: if request.auth != null;) - 确认用户认证状态:
UserData.instance.User需是已通过Firebase Auth认证的有效用户,无有效token会导致上传被静默拒绝 - 更新Firebase SDK:使用最新版本的Unity Firebase SDK,旧版本可能存在Android端路径处理或任务调度的Bug
内容的提问来源于stack exchange,提问作者Marik
相关产品推荐
相关产品推荐

