iOS调用Firebase可调用函数遇too many HTTP redirects错误求助
问题
在iOS应用中集成Firebase HTTPS可调用函数时,调用出现too many HTTP redirects错误,错误日志如下:
2023-02-18 19:40:38.701646-0600 Spaces[16235:3277636] Task <48F8CCDC-85B7-451F-9D00-FC93D93B7AFC>.<1> finished with error [-1007] Error Domain=NSURLErrorDomain Code=-1007 "too many HTTP redirects" UserInfo={NSLocalizedDescription=too many HTTP redirects, NSErrorFailingURLStringKey=https://accounts.google.com/v3/signin/rejected?continue=https://uc.appengine.google.com/_ah/conflogin?state%3D~AJKiYcHgSfXKmjn8R3F7NQNdJB-nW8eUS2Xxxojs23jJxTuoOb6Rt2tr-ooa5vw_yCMFz2P1PZUzwzuI-GSUDkbDWHqF-UQ30JQOejlBnzcpcSAKxl60g4hHYnHsvNyJBRHx2z4JxKohRxTwAGiL9ryos8HHOQp1_0GOfqHncrBjMwXXdHNJoWAXtJ4-bf7K3sfh32yXYxEIkKiTadJMenpzjDp4MCu8LbG5OXVXI1tXqAouERC_B4-JQA2esYzTGw704LdBdksK&dsh=S1057996816:1676770836995843&flowEntry=ServiceLogin&flowName=WebLiteSignIn&ifkv=AWnogHcLgDBo5gsyBrVbQJMIcoCwk3TXQujaljG27PM2wEBBNE0chcGuSa8bvjDtbyfz1Ii6UodjEw&rhlk=no&rrk=32, NSErrorFailingURLKey=https://accounts.google.com/v3/signin/rejected?continue=https://uc.appengine.google.com/_ah/conflogin?state%3D~AJKiYcHgSfXKmjn8R3F7NQNdJB-nW8eUS2Xxxojs23jJxTuoOb6Rt2tr-ooa5vw_yCMFz2P1PZUzwzuI-GSUDkbDWHqF-UQ30JQOejlBnzcpcSAKxl60g4hHYnHsvNyJBRHx2z4JxKohRxTwAGiL9ryos8HHOQp1_0GOfqHncrBjMwXXdHNJoWAXtJ4-bf7K3sfh32yXYxEIkKiTadJMenpzjDp4MCu8LbG5OXVXI1tXqAouERC_B4-JQA2esYzTGw704LdBdksK&dsh=S1057996816:1676770836995843&flowEntry=ServiceLogin&flowName=WebLiteSignIn&ifkv=AWnogHcLgDBo5gsyBrVbQJMIcoCwk3TXQujaljG27PM2wEBBNE0chcGuSa8bvjDtbyfz1Ii6UodjEw&rhlk=no&rrk=32, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <48F8CCDC-85B7-451F-9D00-FC93D93B7AFC>.<1>" ), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <48F8CCDC-85B7-451F-9D00-FC93D93B7AFC>.<1>, NSUnderlyingError=0x28045b2a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1007 "(null)"}}
可调用函数代码
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; admin.initializeApp(); // const fcm = admin.messaging(); const db = admin.firestore(); exports.addNumbers = functions.https.onCall((data) => { // [END addFunctionTrigger] // [START readAddData] // Numbers passed from the client. const firstNumber = data.firstNumber; const secondNumber = data.secondNumber; // [END readAddData] // [START addHttpsError] // Checking that attributes are present and are numbers. if (!Number.isFinite(firstNumber) || !Number.isFinite(secondNumber)) { // Throwing an HttpsError so that the client gets the error details. throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' + 'two arguments "firstNumber" and "secondNumber" which must both be numbers.'); } // [END addHttpsError] // [START returnAddData] // returning result. return { firstNumber: firstNumber, secondNumber: secondNumber, operator: '+', operationResult: firstNumber + secondNumber, }; // [END returnAddData] });
iOS端Swift调用代码
func callNumbers() { DispatchQueue.global(qos: .background).async { functions.httpsCallable("addNumbers").call(["firstNumber": 10, "secondNumber": 5]) { result, error in if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) let message = error.localizedDescription let details = error.userInfo[FunctionsErrorDetailsKey] } // ... } if let data = result?.data { print(data) } } } }
需要解决该问题,实现通过可调用函数在服务器端执行任务。
解决方案
检查函数权限配置
这个错误大多是身份验证流程循环重定向导致。如果你的addNumbers函数不需要用户登录即可调用,在Firebase控制台的函数页面,进入该函数的权限设置,将访问权限改为允许所有用户调用(测试环境可用,生产环境需根据业务需求配置严格权限)。同时确认函数代码中没有强制要求未登录用户跳转认证的逻辑。验证iOS端Firebase初始化
确保FirebaseApp.configure()在AppDelegate的application(_:didFinishLaunchingWithOptions:)方法中正确调用,且GoogleService-Info.plist文件完整无误,包含正确的项目ID、API密钥、应用ID等信息,避免因配置错误触发异常重定向。确认函数部署状态
执行firebase functions:log查看函数部署日志,确认函数已成功上线且无报错。也可以在Firebase控制台的函数页面,直接测试addNumbers函数(传入{"firstNumber":10,"secondNumber":5}),验证函数本身是否能正常返回结果。清除设备缓存与网络重置
设备端的网络缓存可能引发重定向循环,尝试清除应用缓存、重启设备,或切换网络环境(比如从Wi-Fi切到移动数据)后重新测试调用。排查手动URL配置
确保iOS端没有手动指定函数的调用URL,完全依赖Firebase SDK自动获取的默认端点。如果之前有手动配置URL的代码,直接移除,避免因URL错误导致的重定向问题。
内容的提问来源于stack exchange,提问作者SamP

