Как определить, выходило ли приложение iOS на передний план из-за быстрого переключения приложений или вручную?

Есть ли способ узнать, выходит ли приложение iOS на передний план после быстрого переключения приложений или вручную? Мне нужно знать, к тому времени, когда вызывается applicationWillEnterForeground, поэтому некоторый конкретный код может быть выполнен (или не выполнен) в зависимости от состояния, в котором приложение вышло на передний план.

РЕДАКТИРОВАТЬ: Оказалось, что это было больше проблема дизайна для меня. Я переместил свой код в applicationDidBecomeActive. Я также добавил свойство BOOL в appDelegate с именем fastAppSwitching (вероятно, неправильное название для него). Я установил это на YES в application:handleOpenURL и application:openURL:sourceApplication:annotation. Затем я добавил следующий код в приложение:didFinishLaunchingWithOptions:

        if (launchOptions) {
            self.fastAppSwitching = YES;
        }
        else {
            self.fastAppSwitching = NO;
        }

В applicationDidBecomeActive я использовал следующий код:

    if (fastAppSwitching == YES) {
        self.fastAppSwitching = NO; //stop, don't go any further
    }
    else {
       ...
    }

EDIT2: MaxGabriel делает следующее замечание: "Просто предупреждение для других, использующих решение, описанное здесь, applicationDidBecomeActive: вызывается, когда пользователь, например, игнорирует телефонный звонок или текстовое сообщение, в отличие от applicationWillEnterForeground". Это на самом деле также верно для покупок в приложении и авторизации в приложении Facebook (впервые в iOS 6). Итак, после некоторого дальнейшего тестирования это текущее решение:

Добавьте новый объект Bool с именем sentThroughWillEnterForeground.

В приложении WillResignActive:

self.passedThroughWillEnterForeground = NO;

В приложении DidEnterBackground:

self.passedThroughWillEnterForeground = NO;

В приложении WillEnterForeground:

self.passedThroughWillEnterForeground = YES;

В приложении DidBecomeActive:

    if (passedThroughWillEnterForeground) {
        //we are NOT returning from 6.0 (in-app) authorization dialog or in-app purchase dialog, etc
        //do nothing with this BOOL - just reset it
        self.passedThroughWillEnterForeground = NO;
    }
    else {
        //we ARE returning from 6.0 (in-app) authorization dialog or in-app purchase dialog - IE
        //This is the same as fast-app switching in our book, so let's keep it simple and use this to set that
        self.fastAppSwitching = YES;
    }

    if (fastAppSwitching == YES) {

        self.fastAppSwitching = NO;
    }
    else {
        ...
    }

EDIT3: я думаю, что нам также нужен бул, чтобы сказать, было ли запущено приложение с прекращено.

2 ответа

Решение

Если ваше приложение запущено другим приложением,

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
  sourceApplicarion:(NSString *)bundleID
         annotation:(id)info;

метод вызывается на вашем делегате приложения. Вы можете использовать этот метод, например, для установки логического переключателя в значение true, которое указывает, было ли приложение запущено другой программой.

Проблема в том, что этот метод вызывается после applicationWillEnterForeground:таким образом, вы не можете сказать в этом методе, было ли ваше приложение запущено вручную или автоматически.

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

В случае, когда ваше приложение открывается из другого приложения, application:openURL:sourceApplication:annotation будет вызван на ваше приложение делегата.

Другие вопросы по тегам