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

iOS中通过Cloud Function推送通知遇INTERNAL错误求助

排查与解决建议

1. 检查Cloud Function服务账号权限

Cloud Function默认使用的App Engine默认服务账号可能缺少Firebase Messaging的发送权限,导致调用时触发内部错误:

  • 进入Google Cloud控制台的IAM页面,找到格式为PROJECT_ID@appspot.gserviceaccount.com的默认服务账号
  • 为该账号添加Firebase Admin SDK Administrator Service Agent角色,或更精细的Firebase Cloud Messaging Sender角色
  • 保存权限设置后重新测试通知推送

2. 确认Token传递的准确性

虽然控制台能正常发送,仍需确保Cloud Function收到的token和控制台使用的完全一致:

  • 在sendNotification函数中添加日志,打印收到的token:
    exports.sendNotification = functions.https.onCall(async (data, context) => {
      const token = data.token;
      console.log('Received token from client:', token); // 新增日志
      // 其余代码保持不变
    });
    
  • 部署更新后的函数,调用后查看Cloud Function日志,对比token是否和控制台使用的完全一致(无多余引号、转义字符)

3. 调整推送参数与Payload结构

contentAvailable: true通常用于静默通知(无弹窗的后台通知),和显式的notification字段搭配可能引发异常:

  • 尝试移除contentAvailable参数,修改推送配置:
    const response = await admin.messaging().sendToDevice(token, payload, {
      priority: 'high'
    });
    
  • 如果需要静默通知,将payload改为data字段而非notification字段:
    const payload = {
      data: {
        title: 'New Notification',
        body: 'You have a new notification!'
      }
    };
    

4. 查看详细错误日志

当前代码仅抛出通用的internal错误,需打印底层错误详情定位问题:

  • 修改sendNotification的catch块:
    catch (error) {
      console.error('Full error details:', error); // 打印完整错误信息
      console.error('Error code:', error.code);
      console.error('Error message:', error.message);
      throw new functions.https.HttpsError('internal', 'Error sending push notification');
    }
    
  • 部署后触发错误,查看Cloud Function日志中的详细错误信息,比如Messaging返回的具体错误码(如invalid-token、permission-denied等)

5. 移除Swift代码中的冗余逻辑

Swift代码中加载本地JS文件的逻辑完全多余(远程Cloud Function无需本地JS代码),移除后可避免潜在混淆:

func sendNotificationFromSwift(clientUid: String) {
    // 移除以下冗余代码块
    // let context = JSContext()!
    // if let filePath = Bundle.main.path(forResource: "index", ofType: "js", inDirectory: "functions") {
    //     do {
    //         let content = try String(contentsOfFile: filePath)
    //         context.evaluateScript(content)
    //     } catch {
    //         print("Error Reading JS File.")
    //     }
    // } else {
    //     print("No Path Found.")
    // }
    
    let functions = Functions.functions()
    let sendNotification = functions.httpsCallable("sendNotification")

    Firestore.firestore().collection("users").document(clientUid).getDocument { snapshot, error in
        if let error = error {
            print(error.localizedDescription)
            return
        } else {
            if let data = snapshot?.data() {
                self.token = data["token"] as? String ?? ""
                print(self.token)
                sendNotification.call(["token": self.token]) { result, error in
                    if let error = error {
                        print("Error Sending Notification: \(error.localizedDescription)")
                        return
                    } else {
                        print("Push Notification Is Sent")
                    }
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:55:35