фоновые загрузки iOS, когда приложение неактивно

когда мое приложение первоначально загружается, пользователю необходимо загрузить большой файл, что-то вроде 200 МБ (верхний предел). Я определенно не могу ожидать, что пользователь будет держать приложение открытым, пока этот файл не будет загружен. Поэтому он/она может закрыть приложение и приложение будет идти в фоновом режиме.

Как я могу продолжить загрузку файла в этом сценарии? Возможно ли это в iOS?

7 ответов


можно запустить фоновую задачу, когда вы начать загрузку:

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

выполнение задачи конечной длины в фоновом режиме

однако такая задача ограничена неопределенным количеством времени выполнения Системой. Однако загрузка файла 200Mb может быть слишком большой задачей в этом случай.


добавить ниже в - (void)applicationDidEnterBackground:(UIApplication *)application

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

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

и вы хорошо идти... У меня есть это в одном из моих опубликованных приложений менеджера загрузки

Это будет работать просто отлично. Вы также можете проверить, сколько времени у вас есть, так как apple включает только 10 минут фоновых задач. Использовать:

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

в одном из моих приложений я загружал огромное количество данных. Я определенно не могу ожидать, что пользователь сохранит приложение на переднем плане, пока данные не будут загружены. Я просто использую следующий код для загрузки данных, пока приложение находится в фоновом режиме. Его работа правильно : -)
Пожалуйста, выполните следующие действия:

1) используйте следующую строку в заголовочном файле ViewController

   @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

синтез его .m-файл.

2) в ViewDidLoad назначить UIBackgroundTaskIdentifier нравится:

   self.backgroundTask = UIBackgroundTaskInvalid;

3) используйте следующую строку кода, здесь я просто держу метод getDataFromServer внутри 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) Если вы хотите проверить оставшееся время для загрузки данных в фоновом режиме, включите следующую строку в applicationDidEnterBackground: (UIApplication *)метод делегата приложения AppDelegate:

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

вы можете использовать NSURLSession, представленный в iOS 7.0 и более поздних версиях, чтобы продолжить загрузку / загрузку файла, даже если приложение приостановлено.

документации Apple

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

и

фоновые сеансы позволяют выполнять загрузку и загрузку контента в фоновом режиме, пока приложение не запущено. Вы можете создать настройка фонового сеанса путем вызова backgroundSessionConfiguration: метод Класс NSURLSessionConfiguration.

классный учебник по использованию NSURLSession в этом ссылке.


AFNetworking позволяет выполнять тяжелую работу в фоновом режиме.

AFNetworking библиотека-отличное сочетание NSURLConnection и NSOperationQueue.Эта библиотека используется для асинхронной загрузки в фоновом режиме, не влияя на другие приложения.

AFNetworking позволяет обрабатывать загрузку с ExpirationHandle т. е. если в любом случае во время загрузки соединение потеряно, оно будет снова подключить к нему.

Источник Библиотека на AFNetworking

Источник AFNetworking работает в фоновом режиме

Ссылка На Apple Яблоко

фоновое выполнение и многозадачность Яблоко


#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");
        }
    }
}

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


создайте приложение iOS для газетного киоска; не стандартное приложение iOS.

стандарт для iOS МКИ:

  • не удается загрузить данные при закрытии.
  • может загружать данные в ограниченное время при нажатии на фон.
  • недостаточно времени для загрузки 200 Мб.

приложения газетного киоска имеют дополнительную привилегию времени для загрузки при закрытии или inBackground. Раз в каждые 24 часа, они имеют привилегию ответить a remoteContentReady делегировать вызов.

создание приложения газетного киоска ничем не отличается от создания стандартного приложения iOS. Вы просто пометите его как приложение newStand.

тогда у вас будет привилегия запускать код, который находится внутри делегирования remoteContentReady.

чтобы получить сигнал remoteContentReady, вы должны отправить сигнал с вашего сервера (c#, php, bla bla).

Не для каждого приложения iOS. Что-то вроде remoteNotification сигнал. Для этого может потребоваться сертификация ssl для вашего веб-сайта.

С Наилучшими Пожеланиями