// // AppDelegate.swift // MusicPlayer // // Created by aaa on 2024/3/25. // import UIKit import CoreData import AVFoundation import Alamofire import Tiercel import FirebaseCore @_exported import IQKeyboardManagerSwift @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? // 用来保存由系统提供的完成处理器 var backgroundSessionCompletionHandler: (() -> Void)? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { //请求通知权限 UNUserNotificationCenter.current() .requestAuthorization(options: [.alert, .sound, .badge]) { (accepted, error) in if !accepted { print("Users are not allowed to be notified of messages.") } } //生成一个FireBase实例 FirebaseApp.configure() //启动前销毁所有的下载任务 MP_DownloadManager.shared.cancelAllTasksIfNeeded() setAudioSupport() MP_NetWorkManager.shared.requestStatusToYouTube() IQKeyboardManager.shared.enable = true IQKeyboardManager.shared.shouldResignOnTouchOutside = true window = UIWindow(frame: UIScreen.main.bounds) window?.backgroundColor = .init(hex: "#161616") switch_lunch() //执行用户启动事件日志 MP_AnalyticsManager.shared.user_launchAction() return true } func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { if identifier == "com.yourApp.backgroundDownload" { MP_DownloadManager.shared.session = SessionManager("com.yourApp.backgroundDownload", configuration: .init()) MP_DownloadManager.shared.session.completionHandler = completionHandler } } //设置播放器会话状态 private func setAudioSupport(){ //设置会话 let session = AVAudioSession.sharedInstance() do { //允许后台活跃,播放以及记录 try session.setCategory(.playAndRecord, mode: .default) //激活会话 try session.setActive(true) try session.overrideOutputAudioPort(.speaker) } catch { print("Failed to set type:\(error.localizedDescription)") } //响应后台控制 UIApplication.shared.beginReceivingRemoteControlEvents() } //MARK: - 页面跳转 ///跳转启动页 func switch_lunch() { let lunchVC = MP_LunchViewController() //动画设置 let transtition = CATransition() transtition.duration = 0.8 transtition.timingFunction = .init(name: .easeOut)//外层模糊化 window?.layer.add(transtition, forKey: "lunch.easeOut") window?.rootViewController = lunchVC window?.makeKeyAndVisible() } ///跳转A面 func switch_aSide() { let tabBarVC = MPSideA_TabBarController() //动画设置 let transtition = CATransition() transtition.duration = 0.8 transtition.timingFunction = .init(name: .easeOut)//外层模糊化 window?.layer.add(transtition, forKey: "aSide.easeOut") window?.rootViewController = tabBarVC window?.makeKeyAndVisible() } //跳转b面 func switch_positive() { let tabBarVC = MPPositive_TabBarController() //动画设置 let transtition = CATransition() transtition.duration = 0.8 transtition.timingFunction = .init(name: .easeOut)//外层模糊化 window?.layer.add(transtition, forKey: "positive.easeOut") window?.rootViewController = tabBarVC window?.makeKeyAndVisible() } // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { /* The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. */ let container = NSPersistentContainer(name: "MusicPlayer") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. /* Typical reasons for an error here include: * The parent directory does not exist, cannot be created, or disallows writing. * The persistent store is not accessible, due to permissions or data protection when the device is locked. * The device is out of space. * The store could not be migrated to the current model version. Check the error message to determine what the actual problem was. */ fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }() // MARK: - Core Data Saving support func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } } ///访问appDelegate let accessAppdelegate = ( UIApplication.shared.delegate as! AppDelegate)