iOS синхронизировала фоновую обработку - PullRequest
12 голосов
/ 06 июня 2011

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

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

Некоторые приходят на ум, но я не такой опытный.

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

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

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

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

Спасибо

Ответы [ 4 ]

5 голосов
/ 22 сентября 2011

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

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

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

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

У меня есть одно приложение в магазине приложений, которое использует метод 5, и другое в работах, которое использует метод 3.

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

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

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

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

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

3 голосов
/ 22 сентября 2011

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

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

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

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

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

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

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

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

2 голосов
/ 06 июня 2011

Самое удобное сообщение - уведомить пользователя об обновлении с помощью push-уведомлений, и при запуске приложения может отображаться экран "обновление ...".

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

0 голосов
/ 28 сентября 2011

Я бы добавил строку фонового режима 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...