Можно ли создавать подклассы UIApplication в iOS?

Ответ

Нет, создавать подклассы UIApplication не рекомендуется и практически никогда не требуется. Apple явно указывает в документации, что UIApplication — синглтон, управляемый iOS, и его подклассирование может привести к нестабильности.

Правильный подход — использование UIApplicationDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, 
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Настройка приложения при запуске
        return true
    }

    func application(_ app: UIApplication, 
                   open url: URL, 
                   options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
        // Обработка deep links
        return true
    }
}

Когда может потребоваться подкласс (крайне редко):

  • Перехват всех событий приложения через sendEvent(_:)
  • Кастомизация обработки удаленных уведомлений

Пример (не рекомендуется без веской причины):

class CustomApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        // Логирование или модификация событий
        super.sendEvent(event)
    }
}
// В Info.plist: Principal class = "YourApp.CustomApplication"

Лучшие практики:

  1. Используйте UIApplicationDelegate для lifecycle событий
  2. Для глобального перехвата событий рассмотрите UIWindow или UIResponder цепочку
  3. Для модификации поведения используйте middleware-паттерны, а не подклассы UIApplication
  4. Следуйте документации Apple: UIApplication предназначен для управления системой, а не для кастомизации

Ответ 18+ 🔞

Да ты послушай, что за дичь в голове у людей бывает! Сидят, блядь, и думают: «А дай-ка я возьму этот священный грааль, UIApplication, и нахуярю от него наследничков!». Ну, ёпта, мозги набекрень, честное слово.

Слушай сюда, распальцовка моя: делать подклассы от UIApplication — это идея уровня «пойду-ка я поссаю против ветра». Apple, эти хитрожопые ребята, прямо в документации пишут, что это синглтон, которым система рулит. Сунешься со своим велосипедом — получишь нестабильность, баги из ниоткуда и волнение ебать на ровном месте.

А как надо, спросишь? Да элементарно, Ватсон! Используй UIApplicationDelegate, для этого он и придуман, блядь.

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Тут твои стартовые пляски с бубном
        return true
    }

    func application(_ app: UIApplication,
                   open url: URL,
                   options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
        // Лови deep link, обрабатывай, короче, работай
        return true
    }
}

«А когда всё-таки можно?» — спросит дотошный чувак. Да почти никогда, блядь! Разве что если ты решил стать богом событий и перехватывать ВСЁ через sendEvent(_:). Или тебе неймётся с удалёнными пушками. Но это уже высший пилотаж, на грани фола.

Вот смотри, как это выглядит (но это не руководство к действию, а предупреждение!):

class CustomApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        // Тут ты можешь, типа, логировать всё или ещё какую хуйню творить
        super.sendEvent(event)
    }
}
// И не забудь в Info.plist ткнуть: Principal class = "YourApp.CustomApplication"

Так как же жить правильно, чтобы не прослыть мудем?

  1. Живи по UIApplicationDelegate. Для событий жизненного цикла — это твой отец родной.
  2. Хочешь глобально что-то ловить? Смотри в сторону UIWindow или в цепочку UIResponder. Не лезь в кишки системы.
  3. Паттерны, блядь, учи. Middleware, например. Красиво, модульно, и Apple не обосрётся.
  4. Запомни раз и навсегда: UIApplication — это как пульт управления атомной станцией от системы. Твоя задача — нажимать разрешённые кнопки через делегат, а не перепаивать микросхемы внутри, думая, что ты умнее всех.

Короче, не выёбывайся. Система умнее. Обычно.