Как определить, выходило ли приложение 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
будет вызван на ваше приложение делегата.