148 lines
6.1 KiB
Swift
148 lines
6.1 KiB
Swift
//
|
|
// 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)
|