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

iOS Swift环境下FCM推送通知无法接收的问题求助

解决FCM注册成功但收不到推送通知的问题

我之前也踩过FCM推送的类似坑,结合你描述的情况——FCM连接正常、能拿到设备令牌,但就是收不到通知,已经开启了推送通知和后台远程通知权限,给你梳理几个关键排查点:

1. 检查设备令牌的格式是否正确

你代码里用了deviceToken.description.trimming...,这里很容易出问题!因为Data的description方法返回的字符串会带有<和>,还有空格,而FCM需要的是纯十六进制字符串。

正确的令牌转换代码应该是这样:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let fcmToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print("正确的FCM令牌: \(fcmToken)")
    // 这里把令牌发送到你的服务器或者直接用这个令牌测试推送
}

如果令牌格式不对,FCM根本无法识别你的设备,自然发不出通知。

2. 确认APNs证书/密钥与FCM配置匹配

  • 检查Apple开发者后台的APNs证书:确保你创建的是**对应环境(开发/生产)**的推送证书,且bundle ID和项目完全一致(大小写都不能错)。
  • 检查FCM控制台的配置:如果你用的是APNs密钥,要确保密钥是有效的,并且关联了你的App ID;如果用的是证书,要把正确的.p12文件上传到FCM。

3. 确认用户已授权通知权限

虽然你在Capabilities里开了权限,但用户可能在App启动时拒绝了通知请求。一定要在代码里主动请求权限:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 请求通知权限
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
        if let error = error {
            print("请求通知权限失败: \(error.localizedDescription)")
            return
        }
        guard granted else {
            print("用户拒绝了通知权限")
            return
        }
        // 权限获取成功后注册远程通知
        DispatchQueue.main.async {
            UIApplication.shared.registerForRemoteNotifications()
        }
    }
    // 其他初始化代码...
    return true
}

如果用户没授权,APNs不会把通知推送到设备上。

4. 检查FCM推送的Payload格式

测试推送时,要确保Payload符合APNs和FCM的要求:

  • 通知消息(由APNs自动展示)需要包含notification字段,同时apns.payload里要有aps结构:
{
  "to": "你的设备令牌",
  "notification": {
    "title": "测试标题",
    "body": "测试内容"
  },
  "apns": {
    "payload": {
      "aps": {
        "sound": "default",
        "badge": 1
      }
    }
  }
}
  • 如果是数据消息(需要App自己处理),要确保content_available设为true(后台接收需要),并且在didReceiveRemoteNotification方法里手动处理展示逻辑。

5. 验证后台模式配置是否生效

除了在Capabilities里勾选“Remote notifications”,还要手动检查Info.plist文件,确认UIBackgroundModes数组里包含remote-notification。有时候Xcode的Capabilities勾选可能没同步到plist,手动添加更保险。

6. 确保测试环境正确

  • 不要用模拟器测试推送!模拟器不支持APNs,必须用真机。
  • 如果是Xcode真机调试,FCM要选开发环境;如果是Ad Hoc或App Store版本,要切换到生产环境。

如果以上都排查过还是没解决,建议打开Xcode的控制台,搜索“APNs”或“FCM”关键词,看看有没有错误日志(比如令牌无效、证书验证失败等),这些日志能帮你快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:27:22