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

Правильный способ опроса сервера в фоновом режиме

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ваш метод 1 не будет работать долгое время, даже если вам удастся временно приостановить ввод данных, и вот почему: Запуск фоновой задачи запускает задачу для НЕТ БОЛЬШЕ 10 минут, если вы не являетесь одним из три типа приложений, которым разрешено работать. Через 10 минут ОС приостанавливает вас.

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

Ответ 2

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

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

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