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

Swift应用GCS下载URL失效(401 App Check令牌无效)排查

Firebase Storage下载URL偶尔出现401(App Check令牌无效)的原因

我在Swift应用中将文件上传至Google Cloud Storage(GCS)的非公开存储桶,上传完成后获取downloadURL并保存。多数文件的下载URL可正常使用,但有部分URL会莫名失效。使用Safari尝试下载这类失效URL时,会返回如下错误:

{
  "error": {
    "code": 401,
    "message": "Firebase App Check token is invalid."
  }
}

我的应用已启用Firebase App Check,明确是令牌无效导致,但不清楚具体原因。以下是最初用于上传文件的函数:

public func putFile(teamFolderName: String, url: URL, filename: String, metadata: StorageMetadata?, completion: @escaping (URL?, Error?)->(Void)) -> StorageUploadTask {
        
        Console.sharedInstance.log.info("Uploading file \(filename) to team folder: \(teamFolderName)")
        
        let fileRef = getTeamStorageReference(for: teamFolderName).child("\(filename)")
        
        let uploadTask = fileRef.putFile(from: url, metadata: metadata, completion: { (metadata, error) in
            guard let _ = metadata else {
                completion(nil,error)
                return
            }
            
            fileRef.downloadURL { (url, error) in
                completion(url,error)
                return
            }
        })
        
        return uploadTask
    }

我目前用HEAD请求校验URL可达性作为临时解决方案:如果URL不可达则重新上传并获取新的downloadURL,这个方案可行,但仍不清楚部分URL失效的原因。以下是更新后的代码:

public func putFile(teamFolderName: String, url: URL, filename: String, metadata: StorageMetadata?, completion: @escaping (URL?, Error?)->(Void)) -> StorageUploadTask {
            
        Console.sharedInstance.log.info("Uploading file \(filename) to team folder: \(teamFolderName)")
        
        let fileRef = getTeamStorageReference(for: teamFolderName).child("\(filename)")
        
        let uploadTask = fileRef.putFile(from: url, metadata: metadata, completion: { (metadata, error) in
            guard let _ = metadata else {
                Async.main {
                    completion(nil, error)
                }
                return
            }
            
            fileRef.downloadURL { (url, error) in
                guard let downloadURL = url else {
                    Async.main {
                        completion(nil, error)
                    }
                    return
                }
                
                // Check if the download URL is reachable
                var request = URLRequest(url:downloadURL)
                request.httpMethod = "HEAD"
                
                let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
                    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                        
                        let statusCode = (response as? HTTPURLResponse)?.statusCode ?? -1
                        let errorDescription = (response as? HTTPURLResponse).debugDescription
                        var errorMsg = "Download URL not reachable. httpResponse.statusCode: (\(statusCode)). -> URL(\(request.url?.absoluteString ?? "missing url"))"
                        errorMsg += " ->  Response: \(errorDescription)"
                        
                        Console.sharedInstance.log.error(errorMsg)
                        Tracker.sharedInstance.trackEvent(withName: "ERROR", eventParameters: ["error": errorMsg])
                        
                        Async.main {
                            completion(nil, error ?? NSError(domain: "com.xxx.app", code: statusCode, userInfo: [NSLocalizedDescriptionKey: errorMsg]))
                        }
                        
                        return
                    }
                    
                    Async.main {
                        completion(downloadURL, nil)
                    }
                }
                
                task.resume()
            }
        })
        
        return uploadTask
    }

请问导致部分downloadURL失效的原因是什么?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:11:36