webentwicklung-frage-antwort-db.com.de

iOS-Hintergrund wird heruntergeladen, wenn die App nicht aktiv ist

Wenn meine App zum ersten Mal heruntergeladen wird, muss der Benutzer eine große Datei herunterladen, etwa 200 MB (obere Grenze). Ich kann definitiv nicht erwarten, dass der Benutzer die App offen hält, bis diese Datei heruntergeladen ist. So schließt er die App und die App geht in den Hintergrund. 

Wie kann ich die Datei in diesem Szenario weiterhin herunterladen? Ist das überhaupt bei iOS möglich?

20

Es ist möglich, eine Hintergrundaufgabe zu starten, wenn Sie mit dem Download beginnen:

Apps, die in den Hintergrund wechseln, können eine zusätzliche Zeit anfordern, um wichtige Aufgaben in letzter Minute abzuschließen.

Ausführen einer Aufgabe mit endlicher Länge im Hintergrund

Eine solche Aufgabe ist jedoch auf eine undefinierte Ausführungszeit durch das System beschränkt. In diesem Fall ist der Download einer 200 MB-Datei jedoch möglicherweise eine zu große Aufgabe.

7
Chris Gummer

Fügen Sie unten in Ihrer - (void)applicationDidEnterBackground:(UIApplication *)application

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

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

und du bist gut zu gehen ... Ich habe dies in einer meiner veröffentlichten Download-Manager-App

Das wird gut funktionieren. Sie können auch überprüfen, wie viel Zeit Sie haben, da Apple nur 10 Minuten Hintergrundaufgaben aktiviert. Benutzen:

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

Sie können NSURLSession, das in iOS 7.0 und höher eingeführt wurde, verwenden, um das Hochladen/Herunterladen einer Datei fortzusetzen, auch wenn die App angehalten ist.

Apple-Dokumentation

Die NSURLSession-Klasse und verwandte Klassen stellen eine API zum Herunterladen von Inhalten bereit. Diese API bietet eine breite Palette von Delegatmethoden Zur Unterstützung der Authentifizierung und gibt Ihrer App die Möglichkeit, Hintergrunddownloads durchzuführen, wenn Ihre App nicht ausgeführt wird, oder unter iOS , Während Ihre App ist ausgesetzt.

Und

Bei Hintergrundsitzungen können Sie Uploads und Downloads von Inhalten Im Hintergrund ausführen, während Ihre App nicht ausgeführt wird. Sie können eine Hintergrundsitzungskonfiguration erstellen, indem Sie die backgroundSessionConfiguration : -Methode für die NSURLSessionConfiguration-Klasse aufrufen.

Ein cooles Tutorial zur Verwendung von NSURLSession an diesem link .

6
Marimuthu

In einer meiner Apps habe ich riesige Datenmengen geladen. Ich kann definitiv nicht erwarten, dass der Benutzer die App im Vordergrund behält, bis die Daten heruntergeladen sind. Ich benutze folgenden Code, um die Daten herunterzuladen, während sich die App im Hintergrund befindet. Es funktioniert einwandfrei :-)
Bitte gehen Sie folgende Schritte durch:

1) Verwenden Sie die folgende Zeile in der Header-Datei von ViewController

   @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

synthese in .m-Datei.

2) In ViewDidLoad weisen Sie UIBackgroundTaskIdentifier wie folgt zu:

   self.backgroundTask = UIBackgroundTaskInvalid;

3) Verwenden Sie die folgende Codezeile, hier halte ich nur die getDataFromServer-Methode in 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) Wenn Sie die verbleibende Zeit prüfen möchten, um Daten im Hintergrund herunterzuladen, fügen Sie in applicationDidEnterBackground die folgende Zeile ein: (UIApplication *) - Anwendungsdelegierungsmethode von AppDelegate:

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

AFNetworking ermöglicht die Ausführung umfangreicher Operationen im Hintergrund.

AFNetworking Library ist eine hervorragende Kombination aus NSURLConnection und NSOperationQueue. Diese Bibliothek wird für das asynchrone Herunterladen im Hintergrund verwendet, das sich nicht auf die andere Anwendung auswirkt.

AFNetworking ermöglicht das Abwickeln mit ExpirationHandle, d. H. Wenn die Verbindung während des Herunterladens verloren geht, wird die Verbindung erneut hergestellt.

Library Source für AFNetworking

Referenzquelle AFNetworking arbeitet im Hintergrund

Apple Referenzlink Apple

Hintergrundausführung und Multitasking 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");
        }
    }
}

Sie können mehr über diese Folie erfahren.
Ich führe nur einige einfache nützliche Modifikationen aus dem Ausschnitt dieser Folie aus. Ich hoffe, das hilft.

0
srjohnhuang

Erstellen Sie eine newsStand-iOS-Anwendung. keine Standardanwendung für iOS.

Standart-iOS-Anwendungen:

  • beim Schließen können keine Daten heruntergeladen werden.
  • daten können in begrenzter Zeit heruntergeladen werden, wenn sie in den Hintergrund gedrückt werden.
  • Nicht genug Zeit, um 200 MB herunterzuladen.

NewsStand-Anwendungen haben ein zusätzliches Zugriffsrecht zum Herunterladen, wenn sie geschlossen sind oder inBackground. Alle 24 Stunden haben sie das Recht, einen remoteContentReady-Delegatenanruf zu beantworten.

Das Erstellen einer newsStand-Anwendung unterscheidet sich nicht vom Erstellen einer Standard-iOS-Anwendung. Sie markieren es einfach als newStand-Anwendung.

Dann haben Sie das Recht, Code auszuführen, der sich in der remoteContentReady-Delegierung befindet.

Um das remoteContentReady-Signal zu empfangen, müssen Sie ein Signal von Ihrer Serverseite aus senden (c #, php, bla bla).

Nicht für jede einzelne iOS-App. So etwas wie ein RemoteNotification-Signal. Sie benötigen möglicherweise eine SSL-Zertifizierung für Ihre Website, um dies zu erreichen.

Freundliche Grüße

0
Add080bbA