// // AppDelegate.swift // MusicPlayer // // Created by aaa on 2024/3/25. // import UIKit import CoreData import AVFoundation @_exported import IQKeyboardManagerSwift @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? 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.") } } setAudioSupport() IQKeyboardManager.shared.enable = true IQKeyboardManager.shared.shouldResignOnTouchOutside = true window = UIWindow(frame: UIScreen.main.bounds) window?.backgroundColor = .init(hex: "#161616") switch_lunch() return true } //设置播放器会话状态 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 = 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 = MPTabBarController() //动画设置 let transtition = CATransition() transtition.duration = 0.8 transtition.timingFunction = .init(name: .easeOut)//外层模糊化 window?.layer.add(transtition, forKey: "aSide.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)