// // AppDelegate+APNS.swift // MoviaBox // // Created by 佳尔 on 2025/4/30. // import UIKit import FirebaseMessaging import FirebaseCore extension AppDelegate { func registerAPNS() { FirebaseApp.configure() Messaging.messaging().delegate = self let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.badge, .sound, .alert]) { grant, error in if !grant { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { if let date = UserDefaults.standard.object(forKey: kSPApnsAlertDefaultsKey) as? Date { #if DEBUG self.showApnsAlert() #else if date.sp_isToday { self.showApnsAlert() } #endif } UserDefaults.standard.set(Date(), forKey: kSPApnsAlertDefaultsKey) } } } UIApplication.shared.registerForRemoteNotifications() } private func showApnsAlert() { let alert = UIAlertController(title: nil, message: "kAlertMessage_03".localized, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Affirm".localized, style: .default, handler: { _ in SPAPPTool.openApnsSetting() })) alert.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel)) SPAPPTool.topViewController()?.present(alert, animated: true) } } extension AppDelegate: UNUserNotificationCenterDelegate { func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken } ///APP处于前台是接收通知消息 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.badge, .banner]) } ///点击通知消息进入app func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { if #available(iOS 16.0, *) { UNUserNotificationCenter.current().setBadgeCount(0) } else { UIApplication.shared.applicationIconBadgeNumber = 0 } guard let userInfo: [String : Any] = response.notification.request.content.userInfo as? [String : Any] else { completionHandler() return } guard let model = SPOpenAppModel.deserialize(from: userInfo) else { completionHandler() return } SPStatAPI.requestStatApns(messageId: model.message_id ?? "", title: response.notification.request.content.title) if let shortPlayId = model.short_play_id { let vc = SPPlayerDetailViewController() vc.shortPlayId = shortPlayId SPAPPTool.topViewController()?.navigationController?.pushViewController(vc, animated: true) } completionHandler() } } //MARK: -------------- MessagingDelegate -------------- extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { if let token = fcmToken { SPApnsAPI.requestUploadDeviceToken(token: token) } let dataDict: [String: String] = ["token": fcmToken ?? ""] NotificationCenter.default.post( name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict ) } }