求助:Firebase Functions在iOS端调用返回NOT FOUND错误
解决iOS调用Firebase Functions返回"NOT FOUND"的问题
嘿,我一眼就看到你遇到的核心问题了——这是函数名称不匹配加上函数类型不兼容导致的,咱们一步步来搞定:
1. 先解决最明显的问题:函数名称不一致
你Swift代码里调用的是testFunction,但部署在GCP的函数名叫helloWorld,这就好比你喊张三但来了李四,系统肯定找不到啊!先把两边的名称统一起来,要么把Swift里的调用改成helloWorld,要么把GCP函数名改成testFunction。
2. 关键:HTTP函数 vs Callable函数不兼容
你现在部署的是普通HTTP云函数(用req、res处理请求响应的那种),但iOS代码里用的是functions.httpsCallable()——这是Firebase专门用来调用Callable Functions的API,两种类型完全不兼容,这才是"NOT FOUND"的核心原因。
给你两种解决方案,选适合你的就行:
方案一:把HTTP函数改成Callable函数
修改GCP上的函数代码,换成Callable函数的写法,同时指定正确的区域(你用的是eu-west-2):
const functions = require("firebase-functions"); // 指定欧盟西部2区域,同时把函数名改成和Swift调用一致的testFunction exports.testFunction = functions.region('eu-west-2').https.onCall((data, context) => { // Callable函数通过data参数获取客户端传来的数据 let message = data.message || 'Hello World!'; // 必须返回一个JSON格式的响应,不能直接send return { result: message }; });
然后重新部署函数:
firebase deploy --only functions:testFunction
部署完成后,你的Swift代码不需要改,直接调用就能正常工作了。
方案二:Swift改用URLSession调用普通HTTP函数
如果你不想修改云函数的类型,那iOS端就得换成普通的HTTP请求来调用,代码示例如下:
func cloudRequest() { // 替换成你自己的项目ID,格式是https://eu-west-2-<你的项目ID>.cloudfunctions.net/helloWorld guard let url = URL(string: "https://eu-west-2-YOUR_PROJECT_ID.cloudfunctions.net/helloWorld") else { print("无效的URL,请检查项目ID和区域") return } var request = URLRequest(url: url) request.httpMethod = "POST" // 如果要传参数,这里可以构造请求体 request.httpBody = "message=From iOS".data(using: .utf8) let task = URLSession.shared.dataTask(with: request) { data, response, error in DispatchQueue.main.async { if let error = error { print("请求出错:\(error.localizedDescription)") return } if let data = data, let responseText = String(data: data, encoding: .utf8) { print("云函数响应:\(responseText)") } } } task.resume() }
最后再检查两个细节
- 确认iOS项目里的
GoogleService-Info.plist是从你的Firebase项目下载的,配置完全正确; - 用
firebase functions:list命令查看已部署的函数列表,确认函数名称、区域和你调用的完全一致。
内容的提问来源于stack exchange,提问作者Chris126
相关产品推荐
相关产品推荐

