Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

При запуске загрузки можно запустить фоновое задание:

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

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

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

Ответ 2

Добавьте ниже в - (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

Ответ 3

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

Документация Apple

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

и

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

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

Ответ 4

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

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);

Ответ 5

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

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

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

Источник библиотеки для AFNetworking

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

Ссылка на Apple Reference Apple

Выполнение фона и многозадачность Apple

Ответ 6

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

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

Ответ 7

Создайте приложение newsStand iOS; не стандартное приложение iOS.

Стандартные приложения iOS:

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

Приложения NewsStand имеют дополнительную временную привилегию для загрузки при закрытии или inBackground. Через каждые 24 часа у них есть привилегия отвечать на вызов делегата remoteContentReady.

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

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

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

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

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