2013-12-17 3 views
4

Я создал образец кода для повторного скачивания файла из сети (каждые 30 секунд или около того). В iOS 7 с использованием услуг фоновой передачи с помощью NSURLSession
Я следовал этому руководству http://mobile.tutsplus.com/tutorials/iphone/ios-7-sdk-background-transfer-service/ и добавил этот таймер, чтобы повторить его.iOS 7 Фоновая передача останавливается через 3 минуты

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; 
mute = [NSTimer scheduledTimerWithTimeInterval:30.0f 
             target:self 
             selector:@selector(startDownload) 
             userInfo:nil 
             repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:mute forMode:NSRunLoopCommonModes]; 

Когда я запускаю его (в фоновом режиме, нажав кнопку домой) в тренажере и на IPad подключенного к Xcode (где я могу увидеть журналы) все работает нормально, и он продолжает непрерывно загружать. Но когда я отсоединяю iPad от Mac и запускаю его на iPad в фоновом режиме примерно через 3 секунды, он перестает работать (handleEventsForBackgroundURLSession в AppDelegate вызывается).

В возможностях проекта Xcode я выбрал фоновое изображение в качестве фоновых режимов.

Что мне здесь не хватает или что я сделал не так, чтобы он остановился примерно через 3 минуты? (По документациям с трансферами IOS 7 Фона он должен работать непрерывно, как нет ограничения по времени в фоновом режиме для этого.)

Благодаря

ответ

2

Попробуйте следующие шаги. Это сработало для меня.

В вашем .h

UIBackgroundTaskIdentifier bgTask; 

В .м

//background task code 
UIApplication *app = [UIApplication sharedApplication]; 

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

[NSTimer scheduledTimerWithTimeInterval:30.0f target:self selector:@selector(startDownload) userInfo:nil repeats:YES]; 

И йор способ загрузки является

-(void)startDownload{ 

    NSLog(@"will log even if in background or foreground"); 
} 
+0

Спасибо за ответ Nitin. Но все тот же результат. Ваше приложение запускается на iPad после отключения от Mac? При запуске в режиме отладки Xcode и симулятора это работает. Но проблема заключается в том, чтобы запускать его как приложение на iPad. – Madhu

+0

Это я использовал в своих приложениях и отлично работает. –

+0

Спасибо Nitin Я получил его работу с помощью вашего сообщения, и это http://stackoverflow.com/questions/10319643/objective-c-proper-use-of -beginbackgroundtaskwithexpirationhandler. Но теперь моя проблема - эксперт на форуме iOS, сказал, что нехорошо использовать таймер, подобный этому, для запуска в фоновом режиме. Он предложил вызвать starDownload, когда предыдущая загрузка завершена, без использования таймера. Планирование делать так. – Madhu

4

Фоновые задачи в iOS7 только даст вам 30 секунд максимум (резко ниже 10 минут). Вместо этого вы должны использовать фоновый режим новой выборки. Вы не должны использовать таймер, но используйте вновь предоставленный API, чтобы спросить, что ОС будет разбужен через регулярные промежутки времени, и настройте свою загрузку с помощью NSURLSession.

+1

Я уже делаю загрузку с использованием NSURLSession и установил фоновый выбор в качестве фоновых режимов. Я использую фоновые передачи, а не задачи. Не могли бы вы объяснить, что вы подразумеваете под «Нельзя использовать таймер, но используйте только что предоставленный API, чтобы спросить, чтобы ОС разбудили через равные промежутки времени». Спасибо – Madhu

+0

@Madhu Вы говорите, что используете выборку, но я не вижу никакого кода, связанного с этим. Недостаточно установить фоновый режим. Вам нужно прочитать информацию о фоновой выборке и о том, как она работает. Вы устанавливаете таймер в коде. Вы не должны. Таймер не запускается после приостановки приложения. –

+0

Спасибо за ответ. Что касается установки фонового режима как Fetch, я думал, что все, что мне нужно сделать, это установить его в возможностях Xcode. Кажется, я неправильно понял. Я буду искать об этом и посмотреть. Спасибо за разъяснения. – Madhu

3

Background Fetch - это нечто иное. Фоновая выборка пробудит ваше приложение для периодических изъятий новых данных (обычно, сетевой запрос < 30s ищет обновления). Это не связано с фоном NSURLSessions и, вероятно, должно быть отключено, если вы на самом деле не используете его для очередей NSURLSessionDownloadTasks или других целей обновления.

Из того, что я понимаю, вполне возможно, что поведение, которое вы видите, на самом деле нормальное. Я не считаю, что фон NSURLSessionDownloadTasks гарантированно работает непрерывно или в любой конфигурации устройства (AC против батареи, WiFi против сотового и т. Д.). Вы сказали, что отключились от своего Mac, который переключил состояние устройства от зарядки до аккумулятора. Среди других факторов этого может быть достаточно, чтобы приостановить передачу или уменьшить пределы загрузки. К сожалению, эта система кажется очень непрозрачной для разработчиков.

Чтобы убедиться, что вы получаете наивысший приоритет, убедитесь, что ваше свойство discretionary на вашем NSURLSessionConfiguration установлено на false. Задачи загрузки, созданные в то время, когда приложение находится в фоновом режиме, всегда будут иметь этот параметр: true, так что там только FYI.

образец код от Apple поставит вас на правильном пути: https://developer.apple.com/library/iOS/samplecode/SimpleBackgroundTransfer/Introduction/Intro.html

1

Практически с помощью [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler: ^{}]; даст вам только 180 sec.Xcode обеспечивает возможность фонового активного приложения во время отладки только для облегчения разработчиков.

0

Задачи загрузки NSURLSession действительно не связаны ограничениями времени. Но они полностью управляются системой. Они могут быть отложены, если системные ресурсы низки. Их обычно набирают, когда нет Wi-Fi или когда устройство не подключено. Система также наблюдает за использованием вашего приложения услуг передачи фона и может относиться к нему с более низким приоритетом, если обнаруживает, что он злоупотребляет этой функцией. Фоновая передача каждые 30 секунд, безусловно, считается злоупотреблением.

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

Смежные вопросы