Фоновая обработка по времени iOS

#ios #background #push-notification

#iOS #фон #push-уведомление

Вопрос:

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

Какие шаблоны проектирования лучше всего подходят для такой задачи в ios?

Мне приходят на ум некоторые из них, но я не настолько опытен.

  1. Возможно, с push-уведомлениями, серверу необходимо отправить сообщение всем клиентам, когда будет доступна новая версия.
  2. Или есть что-то похожее на сервис Android, который может помочь?
  3. Или, может быть, каждый раз, когда приложение запускается (или выходит на передний план), просто пингуйте сервер и смотрите, есть ли что-нибудь новое.
  4. Или каждый раз, когда приложение запускает пинг сервера, плюс добавьте таймер на следующие 12 часов на случай, если это приложение все еще будет на переднем плане.
  5. Или, каждый раз при запуске приложения, проверяйте значение предпочтения, и если последний раз сервер пинговался более 12 часов назад, то пропингуйте его сейчас. А затем сохраните это время пинга.

Вариант 1 может быть более загруженным на сервере и может быть более сложным в реализации (рассмотрим ios newbe), но может быть единственным вариантом для реального фонового обновления. Но даже в этом случае я по-прежнему не хочу, чтобы пользователю приходилось реагировать на какое-либо низкоуровневое обновление данных между клиентом и сервером (и это то, что есть), поэтому, если push-уведомления не могут переходить непосредственно в приложение и выполнять что-либо без вмешательства пользователя, тогда эта опция не работает.
Все варианты 3-5 возможны и не кажутся слишком сложными, но они будут работать только тогда, когда приложение находится на переднем плане.

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

Возможно, существующие ограничения имеют веские причины, так как же мне играть по правилам и быть в состоянии обеспечить периодический пинг сервера (или, в более общем плане, решить проблему периодической синхронизации ч / б клиентов и серверов, даже когда приложения находятся в bg)?

Спасибо

Комментарии:

1. Я бы предложил 4 или 5. Приложение может делать в фоновом режиме все, что захочет, но только в течение 10 минут. Push-уведомления могут запускать код только в том случае, если они отображают сообщение и пользователь решает их открыть.

Ответ №1:

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

Следует иметь в виду, что приложение не должно использовать какую-либо квоту тарифного плана телефона, не сообщая пользователю, что оно что-то загружает. Некоторые приложения предназначены для загрузки всего, например, клиентов Twitter, поэтому характер приложения подсказывает пользователю, что приложение использует тарифный план. Другие приложения, такие как программа для рисования, не требуют явной загрузки, поэтому должны уведомлять пользователя о необходимости загрузки.

Поскольку Apple не предоставляет разработчикам возможность загрузки в фоновом режиме, пользователи iOS обучены ждать, пока их приложения загрузят обновленные данные. Типичный способ улучшить работу пользователя в ожидании загрузки — это как минимум показывать счетчик, давая пользователю знать, что приложение работает. Чтобы еще больше улучшить интерфейс, отправьте загрузку в другой поток и позвольте пользователям продолжать использовать остальную часть приложения. Они могут взаимодействовать со старыми данными или использовать части приложения, которые не нуждаются в обновлении.

Apple не предоставляет программистам механизма для загрузки нового контента в фоновом режиме для большинства типов приложений. Согласно объявлениям Apple, функция Newsstand в iOS 5 позволит обновлять подписки в фоновом режиме. Возможно, в будущем у нас, разработчиков, будет больше возможностей для фоновой загрузки.

У меня есть одно приложение в App Store, которое использует метод 5, и другое в works, которое использует метод 3.

Я бы использовал push-уведомления (метод 1), если люди захотят как можно скорее узнать, что доступны новые данные. Это будет зависеть от темы.

В iOS нет ничего похожего на службу Android (метод 2)

У меня есть приложение, которое проверяет RSS-канал на наличие новостей при каждом запуске приложения (метод 3). Это приложение в основном выполняет другие функции, но показывает ленту в начальном представлении. Поскольку приложение представляет собой простую утилиту, которая помогает людям найти конкретное решение, RSS-канал является вспомогательным.

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

Моя реализация метода 5 в моем доступном в настоящее время приложении имеет небольшие изменения. Он загружает данные только для одного из многих представлений. При каждом посещении этого представления оно сверяется с сохраненным временем, чтобы увидеть, следует ли загружать свежие данные. Затем он запрашивает разрешение.

Ответ №2:

Возможно, существующие ограничения имеют веские причины, так как же мне играть по правилам и быть в состоянии обеспечить периодический пинг сервера (или, в более общем плане, решить проблему периодической синхронизации ч / б клиентов и серверов, даже когда приложения находятся в bg)?

Любой из вариантов 3, 4 или 5 — правильный путь.

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

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

  • Примите ввод пользователя, но не отображайте результат, пока вы не подтвердите, что данные обновлены (или не загрузите новые данные).

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

  • Отобразите сообщение «данные, которые в последний раз обновлялись по адресу: …` где-нибудь поблизости.

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

Ответ №3:

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

Одна из основных концепций дизайна в iOS заключается в том, что приложение выполняет то, о чем его просит пользователь. итак, если вам необходимо установить обновления, требующие больших объемов данных, вам следует использовать push-уведомления и диалоговое окно обновления. Если ваши обновления происходят очень часто (вы писали о 12-часовых проверках -> предполагаемый цикл обновления 24-48 часов), возможно, вам захочется загружать новые данные при каждом запуске приложения. Хорошим примером этого является Friendly для iPad — они загружают тонны html / javascript / css для использования в качестве основы для отображения контента facebook в WebViews, потому что структуры facebook быстро меняются.

Ответ №4:

Я бы добавил строку фонового режима voip в ваш файл Info.plist. Затем вы можете вызвать setKeepAliveTimeout:handler: , который позволяет вам периодически запускать запланированную задачу. Имейте в виду, что для этого потребуется больше заряда батареи.

Дополнительная информация: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW15

Комментарии:

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