|
|
@@ -1,17 +1,137 @@
|
|
|
import Flutter
|
|
|
import UIKit
|
|
|
import BackgroundTasks
|
|
|
+import UserNotifications
|
|
|
|
|
|
@main
|
|
|
@objc class AppDelegate: FlutterAppDelegate {
|
|
|
- override func application(
|
|
|
- _ application: UIApplication,
|
|
|
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
|
- ) -> Bool {
|
|
|
- GeneratedPluginRegistrant.register(with: self)
|
|
|
- BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.shishi.dingwei.refresh", using: nil) { task in
|
|
|
- // 处理后台任务
|
|
|
- }
|
|
|
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
|
- }
|
|
|
+ private var pushChannel: FlutterMethodChannel?
|
|
|
+ private var notificationDelegate: UNUserNotificationCenterDelegate?
|
|
|
+
|
|
|
+
|
|
|
+ override func application(
|
|
|
+ _ application: UIApplication,
|
|
|
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
|
+ ) -> Bool {
|
|
|
+ GeneratedPluginRegistrant.register(with: self)
|
|
|
+ BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.shishi.dingwei.refresh", using: nil) { task in
|
|
|
+ // 处理后台任务
|
|
|
+ }
|
|
|
+ ///设置推送
|
|
|
+ setupPushNotifications();
|
|
|
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 设置推送通知
|
|
|
+ func setupPushNotifications() {
|
|
|
+ let controller = window?.rootViewController as! FlutterViewController
|
|
|
+
|
|
|
+ // 创建推送通道
|
|
|
+ pushChannel = FlutterMethodChannel(
|
|
|
+ name: "com.example.app/push_notification",
|
|
|
+ binaryMessenger: controller.binaryMessenger
|
|
|
+ )
|
|
|
+
|
|
|
+ // 设置方法调用处理
|
|
|
+ pushChannel?.setMethodCallHandler { [weak self] call, result in
|
|
|
+ switch call.method {
|
|
|
+ case "getDeviceToken":
|
|
|
+ self?.getDeviceToken(result: result)
|
|
|
+ case "requestPermission":
|
|
|
+ self?.requestNotificationPermission(result: result)
|
|
|
+ default:
|
|
|
+ result(FlutterMethodNotImplemented)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建单独的通知代理
|
|
|
+ let delegate = NotificationDelegate(pushChannel: pushChannel!)
|
|
|
+ UNUserNotificationCenter.current().delegate = delegate
|
|
|
+ self.notificationDelegate = delegate
|
|
|
+
|
|
|
+ // 请求推送权限
|
|
|
+ UNUserNotificationCenter.current().requestAuthorization(
|
|
|
+ options: [.alert, .sound, .badge]
|
|
|
+ ) { granted, error in
|
|
|
+ if granted {
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ UIApplication.shared.registerForRemoteNotifications()
|
|
|
+ }
|
|
|
+ } else if let error = error {
|
|
|
+ print("Error: \(error.localizedDescription)")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /// 获取设备令牌
|
|
|
+ private func getDeviceToken(result: @escaping FlutterResult) {
|
|
|
+ if let token = UserDefaults.standard.string(forKey: "deviceToken") {
|
|
|
+ result(token)
|
|
|
+ } else {
|
|
|
+ result(nil)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 请求推送权限
|
|
|
+ private func requestNotificationPermission(result: @escaping FlutterResult) {
|
|
|
+ UNUserNotificationCenter.current().requestAuthorization(
|
|
|
+ options: [.alert, .sound, .badge]
|
|
|
+ ) { granted, error in
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ if let error = error {
|
|
|
+ result(FlutterError(code: "notification_error", message: error.localizedDescription, details: nil))
|
|
|
+ } else {
|
|
|
+ result(granted)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 处理接收到的推送令牌
|
|
|
+ override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
|
|
|
+ let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
|
|
|
+ UserDefaults.standard.set(token, forKey: "deviceToken")
|
|
|
+
|
|
|
+ // 将令牌发送到Flutter
|
|
|
+ pushChannel?.invokeMethod("onTokenReceived", arguments: token)
|
|
|
+ print("APNs token: \(token)")
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 处理推送注册失败
|
|
|
+ override func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
|
|
|
+ print("Failed to register for remote notifications: \(error.localizedDescription)")
|
|
|
+ pushChannel?.invokeMethod("onTokenError", arguments: error.localizedDescription)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 单独的通知代理类
|
|
|
+class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
|
|
|
+ private let pushChannel: FlutterMethodChannel
|
|
|
+
|
|
|
+ init(pushChannel: FlutterMethodChannel) {
|
|
|
+ self.pushChannel = pushChannel
|
|
|
+ super.init()
|
|
|
+ }
|
|
|
+
|
|
|
+ func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
|
|
|
+ let userInfo = notification.request.content.userInfo
|
|
|
+ print("Foreground notification received: \(userInfo)")
|
|
|
+
|
|
|
+ // 将通知内容发送到Flutter
|
|
|
+ pushChannel.invokeMethod("onNotificationReceived", arguments: userInfo)
|
|
|
+
|
|
|
+ // 显示通知
|
|
|
+ completionHandler([.alert, .sound, .badge])
|
|
|
+ }
|
|
|
+
|
|
|
+ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
|
|
|
+ let userInfo = response.notification.request.content.userInfo
|
|
|
+ print("Notification tapped: \(userInfo)")
|
|
|
+
|
|
|
+ // 将点击事件发送到Flutter
|
|
|
+ pushChannel.invokeMethod("onNotificationTapped", arguments: userInfo)
|
|
|
+
|
|
|
+ completionHandler()
|
|
|
+ }
|
|
|
}
|