Могу ли я получить уведомление о запуске iOS после запуска приложения?

Я ищу способ получить UIApplicationLaunchOptionsLocalNotificationKey на iOS, который не требует использования делегата приложения, т.е. я не хочу реализовывать следующее:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UILocalNotification *localNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotification != nil)
    {
        // Process notification
    }
}

Я пытаюсь создать вспомогательную библиотеку, которой нужна информация об уведомлении о запуске. Есть ли способ сделать это? Могу ли я получить параметры запуска другим способом на более позднем этапе процесса подачи заявки?


person Michael    schedule 05.08.2013    source источник


Ответы (2)


Вы можете добавить себя в качестве наблюдателя за уведомлением UIApplicationDidFinishLaunchingNotification, которое будет отправлено приложением и содержит информацию, которую вы ищете.


Как предполагает @Stavash, существуют ограничения. При первом запуске вы не сможете получить это уведомление, поскольку экземпляр вашей библиотеки не будет создан (ваш класс должен находиться в корневом XIB). Но это уведомление также будет отправлено, когда приложение будет повторно открыто для локальных / удаленных уведомлений.

person Wain    schedule 05.08.2013
comment
Но на данном этапе будет ли инициализирован какой-либо другой класс, кроме AppDelegate, и сможет ли он наблюдать и обрабатывать это уведомление? - person Stavash; 05.08.2013
comment
Идеально!! В итоге я использовал комбинацию сообщения загрузки и наблюдателя. Спасибо за совет... + (void) load { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(myFunction:) name: @UIApplicationDidFinishLaunchingNotification объект: ноль]; } - person Michael; 06.08.2013

Используйте категорию AppDelegate и внутри метода +load вашей категории добавьте наблюдателя для UIApplicationDidFinishLaunchingNotification. Для класса наблюдателя вы не можете использовать «я», но вам придется использовать одноэлементный объект. Вот точные шаги, чтобы сделать это.

  1. Добавьте категорию для вашего AppDelegate. Например: @interface AppDelegate (уведомление).
  2. Реализуйте метод +load в своей категории. Когда приложение запускается, оно начинает вызывать метод +load для всех загружаемых классов. Это включает в себя и ваши категории.
  3. Создайте класс Singleton с методом, который будет получать NSNotification. Поэтому реализуйте такую ​​подпись: (void)appDidLaunch:(NSNotification *)notification; в вашем одноэлементном классе.
  4. Внутри метода +load добавьте наблюдателя для уведомления «UIApplicationDidFinishLaunchingNotification».
  5. Сделайте одноэлементный объект своим наблюдателем для этого уведомления.
  6. Добавьте точки останова в методы +load и appDidLaunch, чтобы увидеть последовательность вызываемых методов. Вы также получите параметры запуска в методе обратного вызова вашего наблюдателя.

Другой способ сделать это — использовать Swizzle для метода инициализации AppDelegate с помощью метода swizzle_init. Таким образом, вы можете избежать объекта Singleton и определить свой метод наблюдателя "appDidLaunch" внутри категории вашего AppDelegate. В этом случае вы можете установить «я» в качестве наблюдателя вашего уведомления.

person Kris Subramanian    schedule 21.03.2015
comment
Downvoter, пожалуйста, добавьте комментарий для downvote. Если решение не сработало для вас, укажите это. Простое голосование без какой-либо подсказки не поможет ни мне, ни сообществу. - person Kris Subramanian; 14.04.2015
comment
Хорошо, после дальнейшего изучения причина, по которой это плохая идея, заключается в том, что вы создаете конфликт между любым существующим методом +load и методом в вашей категории. Согласно документам, вы не должны называть методы своей категории так же, как существующий метод, а +load находится в NSObject, поэтому будет конфликт. developer.apple.com/library/archive/documentation/Cocoa/ - person SJT; 14.01.2019
comment
Нет, +load особенный. Он может существовать одновременно в категории и в классе-владельце. Конфликта нет. - person dgatwood; 01.08.2019