iOS Flutter中如何将实例方法作为函数/闭包类型回调?Swift代码求助
FlutterDownloader iOS端AppDelegate.swift代码修正方案
原代码存在的问题及修正措施:
未遵循UNUserNotificationCenterDelegate协议
原代码尝试将self赋值给通知中心代理,但类未声明遵循该协议,导致类型转换无效。需在类声明中添加该协议。强制解包存在崩溃风险
原注册方法里用!强制解包插件注册器,找不到插件时会直接崩溃,改用可选绑定处理更安全。冗余导入优化
FirebaseCore已包含在Firebase包中,可移除冗余导入。
修正后的完整代码:
import UIKit import Flutter import Firebase import flutter_downloader @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate, MessagingDelegate, UNUserNotificationCenterDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins) Messaging.messaging().delegate = self if #available(iOS 10.0, *) { // 直接赋值self,无需强制转换 UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { _, _ in } ) } application.registerForRemoteNotifications() return super.application(application, didFinishLaunchingWithOptions: launchOptions) } private func registerPlugins(registry: FlutterPluginRegistry) { // 用guard let避免强制解包崩溃 guard let registrar = registry.registrar(forPlugin: "FlutterDownloaderPlugin") else { return } if !registry.hasPlugin("FlutterDownloaderPlugin") { FlutterDownloaderPlugin.register(with: registrar) } } }
修正说明:
- 类声明添加
UNUserNotificationCenterDelegate,确保通知代理回调能正常触发,无需类型转换。 - 使用
guard let安全获取注册器,避免找不到插件时崩溃。 - 移除冗余的
FirebaseCore导入,简化代码结构。
内容的提问来源于stack exchange,提问作者Muhammad Umair Saqib
相关产品推荐
相关产品推荐

