如何在AppDelegate.swift配置APNs及Flutter端实现等效APNs配置
迁移核心思路
FlutterAppDelegate本身完整实现了UIApplicationDelegate协议的全部能力,不需要替换继承关系,只需要把原生项目中写在AppDelegate里的APNs相关代码,按Flutter的初始化规则调整少量调用顺序,就能实现和原生完全等效的运行效果。
具体操作步骤
- 保留AppDelegate对FlutterAppDelegate的继承关系,不要改回纯UIApplicationDelegate的继承逻辑,否则会导致Flutter引擎初始化失败,所有Flutter路由、插件功能都会失效。
- 调整启动阶段的APNs注册逻辑:把原原生项目中写在
didFinishLaunchingWithOptions方法里的APNs权限申请、远程通知注册代码,移到同名下的Flutter AppDelegate方法中,必须在所有业务APNs代码前优先调用super的同名初始化方法,保证Flutter核心逻辑先完成初始化。示例代码:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 这一步是必须的,不能省略 [super application:application didFinishLaunchingWithOptions:launchOptions]; // 以下为原原生项目中的APNs启动逻辑,直接原封不动搬入即可 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { // 保留原有的权限获取回调逻辑 }]; [application registerForRemoteNotifications]; return YES; } - 完整迁移所有APNs相关的代理回调方法,每个重写的方法第一时间调用super的同名实现,避免打断Flutter内部的事件路由:
- 迁移APNs注册成功后返回deviceToken的
didRegisterForRemoteNotificationsWithDeviceToken方法,保留原有token上报、本地存储的所有逻辑 - 迁移APNs注册失败的
didFailToRegisterForRemoteNotificationsWithError方法,保留原有错误上报、提示的逻辑 - 迁移UNUserNotificationCenterDelegate的全部实现,包括前台通知展示、通知点击响应的方法,原封不动保留原有跳转、参数处理逻辑即可,不需要把逻辑转移到Dart层执行
- 迁移APNs注册成功后返回deviceToken的
等效性保障注意事项
- 所有重写的系统代理方法都不能漏调super实现:如果漏调,会导致Flutter生态的推送插件无法接收到系统事件,出现和原生行为不一致的问题,比如token获取失败、通知点击无响应。
- 注意代理设置的时序:如果项目集成了自带APNs代理设置的Flutter插件(比如firebase_messaging),需要把
UNUserNotificationCenter.delegate = self的代码放到App启动流程的最后执行,避免被插件覆盖代理引用,导致原有原生逻辑失效。 - 不要复用Flutter插件自带的权限申请、APNs注册逻辑,手动按原有时序在原生层触发注册,就能完全对齐原生项目的权限弹窗时机、注册流程时序,不会出现行为差异。
整个迁移过程不需要改动任何Dart层业务代码,按上述规则调整完原生AppDelegate的逻辑后,APNs的全链路运行效果和纯原生iOS开发的效果没有区别。
内容的提问来源于stack exchange,提问作者ccd
相关产品推荐
相关产品推荐

