Xamarin.iOS应用无法接收Firebase推送通知,求代码问题排查
排查Xamarin.iOS Firebase推送通知接收失败的问题
我帮你梳理下代码里可能遗漏的几个关键环节,这些都是集成Firebase推送时容易忽略的点:
没有将APNs设备令牌绑定到Firebase Messaging
这是最核心的问题!在RegisteredForRemoteNotifications方法中,你获取到了Apple返回的deviceToken,但没有把它传给Firebase SDK。Firebase需要这个令牌来关联你的设备,才能将服务器的通知路由到对应的设备上。你需要在这个方法里添加一行代码:
public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) { Console.WriteLine("Registered for remote notifications"); Console.WriteLine(deviceToken.GetBase64EncodedString(NSDataBase64EncodingOptions.None)); // 新增:将APNs令牌传给Firebase Messaging.SharedInstance.ApnsToken = deviceToken; }旧版推送方法未关联Firebase处理逻辑
你重写的DidReceiveRemoteNotification方法,需要让Firebase SDK处理接收到的消息内容,否则Firebase无法正确解析通知数据。修改这个方法:public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler) { Console.WriteLine("Received a notification"); // 新增:让Firebase处理消息 Messaging.SharedInstance.AppDidReceiveMessage(userInfo); completionHandler(UIBackgroundFetchResult.NewData); }权限请求后的注册逻辑优化
当前你不管用户是否授权通知权限,都会调用RegisterForRemoteNotifications,这可能导致无效操作。建议在授权回调里判断授权状态后,再在主线程触发注册:UNUserNotificationCenter.Current.RequestAuthorization(authOptions, (granted, error) => { Console.WriteLine(granted); if (granted) { // UI操作必须在主线程执行 InvokeOnMainThread(() => UIApplication.SharedApplication.RegisterForRemoteNotifications()); } });前台通知的调试增强
你实现的WillPresent方法可以增加日志输出,确认是否收到了通知内容,方便调试:public void WillPresent(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler) { Console.WriteLine("Handling iOS 11+ foreground notification"); // 输出通知内容,确认是否接收到 Console.WriteLine($"Notification UserInfo: {notification.Request.Content.UserInfo}"); completionHandler(UNNotificationPresentationOptions.Sound | UNNotificationPresentationOptions.Alert); }
做完这些修改后,重新部署测试,应该就能正常接收Firebase推送通知了。
内容的提问来源于stack exchange,提问作者RafaelFerreira
相关产品推荐
相关产品推荐

