Uruchamiam pobieranie w tle za pomocą content-available
flagi w powiadomieniu wypychanym. Mam fetch
i remote-notification
UIBackgroundModes
włączone.
Oto implementacja, której używam w mojej AppDelegate.m:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Gdy aplikacja działa w tle, działa dobrze. (Powiadomienie zostało odebrane, a aplikacja uruchomiła powiadomienie lokalne „wygląda na to, że dostałem powiadomienie”, tak jak powinien to zrobić powyższy kod).
Jednak gdy aplikacja nie działa, a content-available
flagę otrzymuje powiadomienie wypychane , aplikacja nie jest uruchamiana, a didRecieveRemoteNotification
metoda delegowania nigdy nie jest wywoływana.
Wideo WWDC Co nowego w wielozadaniowości (nr 204 z WWDC 2013) pokazuje to:
Mówi, że aplikacja jest „uruchamiana w tle” po otrzymaniu powiadomienia wypychanego z content-available
flagą.
Dlaczego moja aplikacja nie uruchamia się w tle?
Tak więc prawdziwe pytanie brzmi:
Czy iOS wykona zadania w tle po tym, jak użytkownik wymusi zamknięcie aplikacji?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions