2015-02-04 5 views
3

Я хочу проверить, было ли мое приложение запущено для извлечения фона в моем делете делегата приложения didFinishLaunchingWithOptions. В словаре launchOptions ничего нет. Так есть ли способ проверить это?Как я могу обнаружить, что мое приложение было запущено для фоновой выборки в методе didFinishLaunchingWithOptions?

Я знаю, что могу проверить applicationState, но по какой-то причине иногда он возвращает UIApplicationStateBackground, даже если я запускаю приложение нормально.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    if (application.applicationState != UIApplicationStateBackground) { 
    // Analytics initialization code 
    } 
} 

Я создал точку останова в коде инициализации Analytics, а иногда он входит в этот блок, даже если я запустить приложение нормально!

Я знаю, что я смогу обнаружить состояние позже, когда будет называться applicationDidBecomeActive или applicationDidEnterBackground. Если я буду использовать этот подход для определения состояния, мне нужно переместить код инициализации Analytics в другое место. Если он остался в application:didFinishLaunchingWithOptions:, он будет вызываться каждый раз, когда мое приложение запускает фоновое извлечение. Так что, возможно, мне нужно просто переместить код инициализации Google Analytics на какой-то другой метод и не проверять applicationState в application:didFinishLaunchingWithOptions:? Если да, то какой метод я могу использовать для этого?

+1

Вы можете моделировать фоновое обновление в тренажере. Я попытался бы взглянуть на [приложение UApplication sharedApplication] applicationState], чтобы увидеть, если он сообщает, что он находится в фоновом режиме. –

+0

Я уже пробовал. Но почему-то иногда он возвращает UIApplicationStateBackground, даже когда я запускаю приложение нормально! – tagirkaZ

+0

@tagirkaZ Вы имеете в виду, когда вы запускаете свое приложение в обычном режиме, и вы обнаруживаете UIApplicationStateBackground в своем файле didFinishLaunchingWithOptions? – CarmeloS

ответ

0

Попробуйте один

[[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(AppIsInBackground:) 
                name:UIApplicationDidEnterBackgroundNotification 
                object:nil]; 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(AppIsActive:) 
                name:UIApplicationDidBecomeActiveNotification 
               object:nil]; 

вы должны вызвать селектор: NSNotificationCenter звонит AppIsInBackground Selector (приложение в фоновом режиме)

- (void) AppIsInBackground:(NSNotification *) notification { 
//Shut down the memory/processor intensive things and save any states for when the app is reinitialized 
} 
+0

'applicationDidEnterBackground' и' applicationDidBecomeActive' - оба вызова после 'application: didFinishLaunchingWithOptions:'. Поэтому этот подход мне не пригодится. – tagirkaZ

3

Посмотрите на слайды 19-21 этой презентации: http://www.slideshare.net/moliver816/background-fetch

Сразу же после запуска вы можете проверить, соответствует ли applicationStateUIApplicationStateBackground, чтобы определить ermine, было ли ваше приложение запущено в фоновом режиме.

В противном случае, если вы просто хотите узнать, когда ваше приложение извлекает данные для обновления фонового приложения, вы можете сделать это внутри метода UIApplicationDelegateapplication:performFetchWithCompletionHandler:.

+0

Благодарим вас за предоставленную вам ссылку! Я знаю, что я должен проверить состояние. Но иногда это UIApplicationStateBackground, даже если я запускаю приложение нормально! – tagirkaZ

+0

Можете ли вы опубликовать код, который вы используете, чтобы проверить? Это не должно быть возможным. – badAPI

+0

Я только что редактировал мой вопрос, может быть, это даст ключ. – tagirkaZ

0

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

+ (Analytics*)sharedInstance 
    { 
    static dispatch_once_t onceToken; 
    static Analytics* sharedInstance; 
    dispatch_once(& onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
     //Do analytics initialization code here 
     }); 
    return sharedInstance; 
    } 
0

следующий метод делегата, который вызывается, когда фоновый выбор выполняется iOS для нашего приложения.

Это метод appDelegate.

FUNC приложение (_ приложение: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Пустота) {}