Flutter iOS端进程杀死后Firebase推送无法触发CallKit来电求助
iOS进程杀死后APNs推送无法触发CallKit来电的解决方案
针对你遇到的iOS进程杀死后,APNs推送能收到但无法触发flutter_callkit_incoming来电的问题,以下是针对性的排查和解决步骤:
1. 修正APNs推送Payload配置
当应用被杀死时,Firebase不会处理推送逻辑,APNs直接将payload传递给iOS系统,此时顶级data字段不会被系统传递到应用回调,必须把呼叫相关数据放到apns.payload的自定义字段中,同时调整APS配置:
{ "message": { "android": { "notification": { "click_action": "Video" }, "priority": "high" }, "apns": { "headers": { "apns-priority": "10", "apns-topic": "你的App Bundle ID" // 必填,确保推送匹配App }, "payload": { "aps": { "content-available": 1, // 唤醒后台应用处理 "mutable-content": 1, // 允许修改通知内容 "alert": { // 保留通知显示,同时触发后台回调 "title": "Incoming video call", "body": "There is a new video call from Ashish Physician." } }, // 把原data字段的所有呼叫数据移到这里 "callerAccessToken": "006030916dbd1494d74add49838cacb570fIAA9j48nGcIUT3PXdYvxqXmg0Civ0pdD+Ra852bM3qJkPPLSuz4AafalIgCyMj7BPvKIYwQAAQDevIdjAgDevIdjAwDevIdjBADevIdj", "calleeSflUserId": "24", "videoSessionId": "211", "type": "NEW_VIDEO_CALL_REQUEST", "callerName": "Ashish Physician", "callerImageUrl": "https://tercardia-develop.s3.us-east-2.amazonaws.com/49/49_profileImage.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20221130T182814Z&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=AKIAV6UT3MGE2DMFHIFS%2F20221130%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Signature=b0eea1f62f02041c62e60f1ed93c3d7bade1becd465feaf35519103e8b72c75f" } }, "notification": { "body": "There is a new video call from Ashish Physician.", "title": "Incoming video call" }, "token": "eB4PSWrDAkg1oyIk-q-dKc:APA91bH7XN2YlRIdUJSlcVAv6pKj8v_-Rd-cXqy0z_8ap__6v2XH05iTWfWNt_ZYtcX_iHu--YyiAW8SW1bET8lXDnpBSVjz2uv69RO54fTpo-5gdv66c_rZSKuRW8alfCTy6mPpts1S" } }
2. 配置iOS端后台回调逻辑
在AppDelegate中实现UNUserNotificationCenterDelegate和后台推送回调,确保应用被杀死时能唤醒并触发CallKit:
Objective-C示例代码:
#import <FlutterCallkitIncoming/FlutterCallkitIncoming.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 设置通知代理 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; // 请求通知权限 [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { [[UIApplication sharedApplication] registerForRemoteNotifications]; } }]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } // 处理后台推送回调(应用杀死时会触发) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSString *callType = userInfo[@"type"]; if ([callType isEqualToString:@"NEW_VIDEO_CALL_REQUEST"]) { // 构造CallKit来电参数 NSDictionary *callData = @{ @"id": userInfo[@"videoSessionId"], @"nameCaller": userInfo[@"callerName"], @"avatar": userInfo[@"callerImageUrl"], @"type": @1, // 1=视频通话 @"supportsVideo": @YES, @"extra": userInfo }; // 触发CallKit来电 [FlutterCallkitIncoming performCall:callData]; } completionHandler(UIBackgroundFetchResultNewData); }
3. 检查iOS后台权限配置
在Xcode中确保开启必要的后台模式:
- 打开项目的
Signing & Capabilities标签 - 添加
Background Modes权限 - 勾选
Remote notifications和Voice over IP(CallKit依赖VoIP模式)
同时在Info.plist中确认配置:
<key>UIBackgroundModes</key> <array> <string>voip</string> <string>remote-notification</string> </array>
4. 测试APNs推送有效性
直接使用APNs测试工具(如Postman)发送推送,绕过Firebase,验证payload是否能触发后台回调:
- 请求Header需包含:
apns-priority:10、apns-topic:你的Bundle ID、apns-push-type:alert - Payload使用修正后的APNs格式,确保自定义数据能被回调解析
内容的提问来源于stack exchange,提问作者Ashish Sharma
相关产品推荐
相关产品推荐

