web-dev-qa-db-fra.com

téléchargement en arrière-plan iOS lorsque l'application n'est pas active

Lorsque mon application est initialement téléchargée, l'utilisateur doit télécharger un fichier volumineux d'environ 200 Mo (limite supérieure). Je ne peux vraiment pas m'attendre à ce que l'utilisateur garde l'application ouverte jusqu'à ce que ce fichier soit téléchargé. Donc, il/elle pourrait fermer l'application et l'application ira en arrière-plan. 

Comment puis-je continuer à télécharger le fichier dans ce scénario? Est-ce même possible sous iOS?

20
Srikar Appalaraju

Il est possible de démarrer une tâche en arrière-plan lorsque vous commencez le téléchargement:

Les applications qui passent en arrière-plan peuvent demander un délai supplémentaire de Pour terminer les tâches de dernière minute importantes.

Exécuter une tâche de longueur finie en arrière-plan

Cependant, une telle tâche est limitée à une durée d'exécution indéterminée par le système. Cependant, un téléchargement de fichier de 200 Mo peut être une tâche trop volumineuse dans ce cas.

7
Chris Gummer

Ajouter ci-dessous dans votre - (void)applicationDidEnterBackground:(UIApplication *)application

UIApplication  *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
        [app endBackgroundTask:bgTask]; 
}];

et vous êtes prêt à partir ... J'ai ceci dans l'une de mes applications de gestionnaire de téléchargement publiées

Cela fonctionnera très bien. Vous pouvez également vérifier le temps dont vous disposez, car Apple n'active que des tâches en arrière-plan de 10 minutes. Utilisation:

NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining];
NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug
39
Saurabh

Vous pouvez utiliser NSURLSession introduit dans iOS 7.0 et versions ultérieures pour poursuivre le téléchargement d’un fichier même lorsque l’application est suspendue.

Documentation Apple

La classe NSURLSession et les classes associées fournissent une API pour Télécharger du contenu. Cette API fournit un ensemble complet de méthodes de délégation Pour prendre en charge l'authentification et donne à votre application la possibilité de Effectuer des téléchargements en arrière-plan lorsque votre application n'est pas en cours d'exécution ou, dans iOS, l'application est suspendue.

Et

Les sessions en arrière-plan vous permettent d'effectuer des ajouts et des téléchargements de contenu En arrière-plan lorsque votre application n'est pas en cours d'exécution. Vous pouvez créer une configuration de session en arrière-plan En appelant la méthode backgroundSessionConfiguration : de la classe NSURLSessionConfiguration.

Un bon tutoriel pour utiliser NSURLSession à ce link .

6
Marimuthu

Dans l'une de mes applications, je chargeais une énorme quantité de données. Je ne peux absolument pas m'attendre à ce que l'utilisateur garde l'application au premier plan jusqu'à ce que les données soient téléchargées. Je viens d'utiliser le code suivant pour obtenir le téléchargement des données lorsque l'application est en arrière-plan. Son fonctionne correctement :-)
Veuillez suivre les étapes suivantes:

1) utilisez la ligne suivante dans le fichier d'en-tête de ViewController

   @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

le synthétiser dans un fichier .m.

2) dans ViewDidLoad, attribuez UIBackgroundTaskIdentifier comme suit:

   self.backgroundTask = UIBackgroundTaskInvalid;

3) Utiliser la ligne de code suivante, je garde ici la méthode getDataFromServer dans beginBackgroundTaskWithExpirationHandler: block.

        self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }];

    /* Here your downloading Code, let say getDataFromServer method */

    [self getDataFromServer]; // Its dummy method

    /* Your downloading Code End Here */

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    });

4) Si vous souhaitez vérifier le temps restant pour télécharger les données en arrière-plan, incluez la ligne suivante dans la méthode applicationDidEnterBackground: (UIApplication *) de délégué d'AppDelegate:

      NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining);
5
Himanshu Mahajan

AFNetworking vous permet d'effectuer une opération lourde en arrière-plan.

AFNetworking Library est une excellente combinaison de NSURLConnection et de NSOperationQueue.Cette bibliothèque est utilisée pour le téléchargement asynchrone en arrière-plan n’affectant pas l’autre application.

AFNetworking vous permet de gérer le téléchargement avec ExpirationHandle, c.-à-d. Que, même pendant le téléchargement, la connexion est perdue, elle se connecte à nouveau.

Source de la bibliothèque pour AFNetworking

Source de référence AFNetworking fonctionne en arrière-plan

Lien de référence Apple Apple

Exécution en arrière-plan et multitâche Apple

3
Sumit Sharma
#pragma mark - View Loading handling
- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
}

#pragma mark - Background handling when application goes background
UIBackgroundTaskIdentifier background_task;
- (void)appDidEnterBackground:(NSNotification *)notification {
    UIApplication  *application = [UIApplication sharedApplication];
    if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
    {
        NSLog(@"Multitasking Supported");
        if (background_task == UIBackgroundTaskInvalid) {
            background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
                NSLog(@"Background task expiration\n");
                //Clean up code. Tell the system that we are done.
                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid;
            }];
            //To make the code block asynchronous
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //### background task starts
                NSLog(@"Running in the background\n");
                for(int cnt=0; cnt<10; cnt++) //while(TRUE)
                {
                    NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
                    [NSThread sleepForTimeInterval:1]; //wait for 1 sec
                }
                //#### background task ends
                //Clean up code. Tell the system that we are done.
                NSLog(@"here you can do something before it really enters background");
                [NSThread sleepForTimeInterval:1]; //wait for 1 sec
                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid;
            });
        }
        else
        {
            NSLog(@"Multitasking Not Supported");
        }
    }
}

Vous pouvez en savoir plus à partir de cette slide .
Je viens de faire quelques modifications simples et utiles à partir du fragment de cette diapositive. J'espère que cela vous aidera.

0
srjohnhuang

Construire une application newsStand iOS; pas une application iOS standard.

Applications iOS standard:

  • ne peut pas télécharger les données à la fermeture.
  • peut télécharger des données en un temps limité lorsque poussé en arrière-plan.
  • Pas assez de temps pour télécharger 200mb.

Les applications NewsStand ont un privilège de temps supplémentaire pour télécharger en fermeture ou en arrière-plan. Une fois toutes les 24 heures, elles ont le privilège de répondre à un appel de délégué remoteContentReady.

Construire une application newsStand n’est pas différent de la construction d’une application iOS standard. Vous allez simplement le marquer comme application newStand.

Ensuite, vous aurez le privilège d'exécuter du code situé à l'intérieur de la délégation remoteContentReady.

Pour recevoir le signal remoteContentReady, vous devez envoyer un signal de votre côté serveur (c #, php, bla bla).

Pas à chaque application iOS. Quelque chose comme un signal de notification à distance. Vous devrez peut-être obtenir une certification ssl pour votre site Web.

Meilleures salutations

0
Add080bbA