Правильный способ опроса сервера в фоновом режиме - PullRequest
17 голосов
/ 27 октября 2010

Предполагая, что это возможно, я бы хотел, чтобы мое приложение для iOS, когда оно было установлено на заднем плане, опрашивало сервер (то есть, по сути, получало содержимое URL-адреса каждые 30 минут и уведомляло пользователя, если оно содержит что-то «интересное»), по существу, ваналогично тому, как работает встроенный почтовый клиент, если вы не используете push-уведомления.

Теперь, из моего чтения (я опытный программист, но новичок в iOS),Я думаю, что может быть два возможных способа сделать это:

  • Метод 1: В applicationDidEnterBackground:, запустить фоновую задачу, которая выполняет периодический опрос;
  • Метод 2: Отправить свой собственныйприложите UILocalNotification без видимого текста для пользователя, но которое просто служит для того, чтобы разбудить ваше приложение за X минут для выполнения опроса (а затем отправить себе другое уведомление для следующего времени и т. д.).

Я вижу в документации Apple Планирование, регистрация и обработка уведомлений , кажется, что они действительно имеютmple usign Method 1 (их пример "chat", Перечисление 2-2).Но что удивительно в этом методе, так это то, что он, кажется, просто сидит в непрерывном цикле, выполняя опрос, без промежуточного сна;на платформах, с которыми я более знаком, это было бы нецелесообразно и могло бы сжечь ЦП.

Так что части моего вопроса по существу: - Возможен ли метод 2 (или должен всегда вызывать UILocalNotificationвидимое предупреждение для пользователя, а это не то, что я хочу), и если да, то рекомендуется ли это делать?- Если способ сделать это - метод 1, является ли пример «чата» Apple «сидеть в непрерывном цикле» действительно нормальным (например, использует ли iOS процессор, так что это не проблема), и если нет, то каким образомiOS сказать фоновому процессу "спать по Х секунд / минут"?И если по какой-то причине непрерывный цикл Apple в порядке, каким будет время для интервалов между опросами?

NB. Я ценю, что возможность работать в фоновом режиме - это, по сути, функция iOS 4.Я не против, если мое приложение будет работать только в iOS 4.

Ответы [ 2 ]

14 голосов
/ 27 октября 2010

То, что вы хотите сделать, не распространяется на функции многозадачности iOS4. Существует только несколько типов приложений, которые могут работать в фоновом режиме в течение длительного времени (более 10 минут), и универсальные сетевые приложения не входят в их число.

Однако еще не все потеряно. Что вы можете сделать, и что я вам верю должен сделать, это использовать push-уведомления. На вашем сервере вы подключаетесь к службе push-уведомлений Apple, пользователь регистрируется для push-уведомлений, и вы либо знаете, что такое «интересные данные», либо они сообщают вам. Когда эти данные доступны, вы немедленно отправляете их пользователю посредством push-уведомления.

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

Ваш метод 1 не будет работать в течение длительного времени, даже если вам удастся приостановить ввод на некоторое время, и вот почему: запуск фоновой задачи запускает задачу не более 10 минут, если вы не являетесь одним из три типа приложений, которым разрешено оставаться запущенными. Через 10 минут ОС приостановит вас.

Ваш метод 2 не будет работать вообще. Все локальные уведомления предоставляют пользователям возможность просмотра предупреждений.

3 голосов
/ 27 октября 2010

Предполагая, что это возможно ...

К сожалению, это ошибочное предположение (!).

Вы не можете сделать это, используя «многозадачность» на iPhone, поскольку он позволяет только определенные виды фоновой обработки (GPS, VoIP, музыка). Чтобы сделать то, что вы хотите, вам нужно будет выполнить работу на сервере и использовать push-уведомления.

...