Как поддерживать актуальность данных, получаемых сервером расширений IOS

Этот вопрос относится к приложению:

  1. Это обеспечивает расширение как его единственную функцию.
  2. Полагается на удаленные данные, полученные с сервера.
  3. Не предлагает ничего полезного в пользовательском интерфейсе, чтобы пользователи регулярно его открывали.

Прекрасным примером такого приложения могут быть приложения-расширения для блокировки контента Safari (iOS 9+), но я считаю, что это не ограничивается этими приложениями.

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

Итак, есть ли какой-либо законный способ поддерживать актуальность данных для приложений на основе расширений без пользовательского интерфейса:

Вещи, о которых я читал в Интернете, похоже, не работают на самом деле:

  • фоновая выборка — требует, чтобы приложение работало как минимум в фоновом режиме
  • тихие push-уведомления (с доступным содержимым = 1) — кажется, требуется, чтобы приложение работало как минимум в фоновом режиме. Может быть перезапущен iOS из завершенного состояния, если пользователь явно не удалил его из списка задач.
  • PushKit (работает и может перезапускать убитые приложения) — подходит только для VoIP-приложений

person yurgis    schedule 18.07.2016    source источник
comment
Вам нужно более четко понимать, что это за приложение, существует много разных типов расширений приложений, и у каждого есть разные причины обновлять его содержимое из Интернета, поэтому вам нужно указать, какое это расширение, т.е. действие, аудио Модуль, блокировщик контента, пользовательская клавиатура, поставщик документов, редактирование фотографий, совместное использование или расширение «Сегодня».   -  person Mostafa Berg    schedule 25.07.2016
comment
Я привел конкретный пример для блокировщиков контента. Но полагайте, что та же проблема обычно применяется к пользовательским клавиатурам, где вы хотите обновить набор правил прогнозирования типов. Возможно, в меньшей степени, чем расширение «Сегодня», только в том случае, если оно не требует полноценного приложения пользовательского интерфейса.   -  person yurgis    schedule 25.07.2016
comment
Вы можете изменить свой вопрос на «Есть ли законный способ поддерживать актуальность данных для приложений?», и ответ будет отрицательным. Фоновая выборка имеет свои ограничения, бесшумная отправка имеет свои ограничения, набор для отправки только для voip. Вы провели исследование, но другого доступного механизма нет. Просто невозможно гарантировать, что приложение всегда обновляется на iOS законным способом, за исключением voip-пушей.   -  person Gruntcakes    schedule 26.07.2016


Ответы (1)


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

Без Push: пользовательский интерфейс или отсутствие пользовательского интерфейса — не проблема. Даже если расширение не отображает пользовательский интерфейс, расширение должно быть запущено, чтобы что-то сделать, в какой-то момент — и в этот момент вы можете обновить данные с сервера. Если это зависит от расширения . Настоятельно рекомендуется реализовать на сервере способ быстрой проверки необходимости обновления данных, например поиск HTTP-заголовка If-Modified-Since, чтобы его можно было часто проверять при очень низких затратах.

Блокировщики содержимого Safari кажутся исключением — во время блокировки Safari не выполняет код из расширения. Вместо этого список действий JSON потребляется и компилируется, что является одноразовым событием. Поэтому для обновления приложения потребуется вызвать reloadContentBlocker(withIdentifier: completionHandler:) ссылку на класс SFContentBlockerManager.

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

person Mike Sand    schedule 25.07.2016
comment
Согласно этому сообщению и многим другим stackoverflow.com/questions/22937616/ тихое нажатие недостаточно хорошо, так как оно не работает, когда пользователь смахивает приложения из списка задач, что в значительной степени является тем, что пользователи делают на регулярной основе, считая, что это сэкономит заряд батареи. - person yurgis; 26.07.2016
comment
@SausageDioxide Было бы неплохо, если бы вы не просто утверждали, что кто-то неверен, но предоставили некоторые источники или объяснения, хотя бы для того, чтобы принести пользу всем, кто придет после. В любом случае: developer.apple.com/library/ios/documentation/UIKit/Reference/: система запускает ваше приложение (или выводит его из приостановленного состояния) и переводит в фоновое состояние, когда приходит удаленное уведомление. - person Mike Sand; 27.07.2016
comment
@yurgis В вашем вопросе не указаны критерии, по которым он должен работать после того, как пользователь завершил приложение. Если кому-то непонятно, требование запуска приложения хотя бы в фоновом режиме имеет другое значение в жизненном цикле приложения. Да, если приложение было закрыто, фоновая отправка не работала. Это все равно будет работать в процессе расширения. В случае с блокировщиками контента, я думаю, пользователь должен ожидать, что блокировщик контента всегда будет работать в фоновом режиме. Если они закроют приложение, оно не сможет оставаться в актуальном состоянии, кажется интуитивно понятным. - person Mike Sand; 27.07.2016
comment
Я не согласен. Расширения не требуют запуска своего основного приложения. Пользователи усвоили это и продолжают закрывать все приложения на панели задач либо для экономии заряда батареи, либо просто для очистки списка задач. - person yurgis; 27.07.2016
comment
@yurgis Несмотря на это, в вашем вопросе не было этого критерия. Я добросовестно предоставил законную стратегию получения серверных данных (таких как правила блокировки) для приложения-расширения (например, блокировщика контента), не требуя от пользователей явного запуска основного приложения на регулярной основе. - person Mike Sand; 27.07.2016
comment
Хорошо, справедливо, поскольку я не был конкретно ясен, но я ДЕЙСТВИТЕЛЬНО упомянул, что знаю этот подход и что он не идеален. - person yurgis; 27.07.2016
comment
@yurgis Это справедливо - вы как бы упомянули - спасибо, что все равно приняли ответ. Надеюсь, что разъяснение того, что приложение не должно работать в фоновом режиме, но будет перезапущено, поможет. Я думаю, что терминология жизненного цикла приложения сбивает с толку всех, и нет термина состояния, если пользователь принудительно закрыл его и т. Д., Что затрудняет рассуждения. Тем не менее, хорошая новость заключается в том, что большинство расширений могут просто обновляться при запуске пользователя, и им не нужно будет использовать это. Удачи. - person Mike Sand; 27.07.2016