App审核时iPad端Firebase测试手机号认证报TOO_LONG错误
问题背景
- 提交iOS应用至App Store审核时被苹果团队驳回,驳回原因:审核人员使用提供的测试手机号,无法在iPad设备上完成登录,Firebase手机认证返回
TOO_LONG错误 - 已验证该测试手机号在实体iPhone设备、Xcode iPad模拟器上均可正常运行,无实体iPad设备可用于复现测试
苹果审核团队提供的报错截图

项目中手机号处理相关代码
private func startAuth(completion: @escaping (Bool) -> Void) { let areaPhoneNum = "+\(self.getCountryCode() + self.phoneNum)" print(areaPhoneNum) PhoneAuthProvider.provider().verifyPhoneNumber(areaPhoneNum, uiDelegate: nil) { [weak self] verificationID, error in if let verificationID = verificationID { self?.verificationID = verificationID completion(true) } else if let error = error { print(error) self?.authPhoneErrorMess = error.localizedDescription self?.isLoading = false completion(false) } } }
问题原因
核心问题出在手机号拼接逻辑缺陷,叠加iPad实体设备的系统文本交互特性,导致传给Firebase的号码格式不符合要求:
- 现有拼接逻辑
"+\(self.getCountryCode() + self.phoneNum)"没有做输入值清洗:如果getCountryCode()返回值带前置/后置空格、或者iPad实体设备触发系统智能填充/号码自动补全时,会给phoneNum字段额外带入重复的国家码、隐藏格式字符(比如不间断空格、拨号分隔符),最终拼接出的字符串长度超出E.164标准手机号最大15位的限制,Firebase就会直接返回TOO_LONG错误。 - 你在iPhone和iPad模拟器上测试正常,是因为手动输入号码时不会触发iPad特有的智能填充规则,也不会带入多余隐藏字符,和审核人员使用实体iPad的操作场景存在差异。
- 现有代码没有对拼接后的号码做格式校验,直接传给Firebase接口,一旦输入值带额外字符就会触发报错。
修复方案:在调用
verifyPhoneNumber前增加两步处理:
- 分别对国家码、手机号输入值做截断清洗,移除所有空格、分隔符、非数字字符
- 校验拼接完成的E.164格式号码总长度不超过15位,确认格式合法后再传给Firebase接口
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

