Пользовательские метрики#

Что такое «Пользовательские метрики»?#

Если вы посмотрите на экран блокировки, вы увидите круг. Внутри этого круга есть текст. Посмотрите внимательнее, и вы заметите, что текст содержит данные об активности пользователя. Дважды нажмите на середину круга, и увидите больше «метрик» о пользователе.

../../_images/met1.png

Там есть уведомление: «Сегодня было отправлено 7 текстовых сообщений.» Откуда это известно?#

../../_images/met2.png

Информация поступает из стороннего приложения (nCounter), которая используется для работу функцию «User Metrics».#

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

Как я могу использовать пользовательские метрики в своём приложении?#

Вся следующая информация будет основана на коде для приложения nCounter.

Файл apparmor приложения должен включать в политику параметр usermetrics :

{
    "policy_groups": [
        "usermetrics"
    ],
    "policy_version": 16.04
}

Далее нужно будет импортировать в файл QML модуль для обработки метрики пользователя:

import UserMetrics 0.1

(Могут быть доступны обновленные версии выше 0.1)

Далее, выбранную Метрику нужно настроить в программном коде как объект:

Metric { // Define the Metric object.
    property string circleMetric // Create a string-type variable called "circleMetric". This is so you can update it later from somewhere else.
    id: metric // A name to reference the metric elsewhere in the code. i.e. when updating format values below.
    name: "nCounter" // This is a unique ID for storing the user metric data
    format: circleMetric // This is the metric/message that will display "today". Again it uses the string variable that we defined above
    emptyFormat: i18n.tr("Check nCounter") // This is the metric/message for tomorrow. It will "activate" once the day roles over and replaces "format". Here I have use a simple translatable string instead of a variable because I didn’t need it to change.
    domain: "ncounter.joe" // This is the appname, based on what you have in your app settings. Presumably this is how the system lists/ranks the metrics to show on the lock screen.
}

Теперь, когда метрика создана, можно обновить «format» или «emptyFormat», когда происходит событие, ссылаясь на переменные в объекте метрики.

onButtonPressed: {
    metric.circleMetric = "New Metric Message"
    metric.update(0)
    console.log("Metric updated")
}

Здесь мы присваиваем новое значение строковой переменной circleMetric, которая находится внутри объекта метрики:

(Помните, что circleMetric - это значение переменной, задаваемое в формате)

Metric Id [dot] Имя переменной [equals] Новые данные для переменной

metric.circleMetric = "Новое сообщение метрики"

Затем мы сообщаем экрану блокировки о том, что необходимо обновить метрику.

Обновление Metric ID [dot] (определённое количество, которое необходимо установить, если оно включено в формат)

metric.update(0)

(Примечание: в этом примере ``0``является произвольным значением, поскольку значение метрики не включает в себя счетчик)

Мы только что обновили метрику по состоянию на сегодня. Когда настанут следующие сутки, метрика будет сброшена к состоянию, указанному в опции `` emptyFormat``.

Для сообщений, звонков и большинства приложений значение этой опции по умолчанию - 0.

Как работает пользовательская метрика?#

Пользовательская метрика состоит из двух «форматов»:

  • метрики/сообщения для текущих суток (format)

  • метрики сообщения для следующих суток (emptyFormat)

Значение emptyFormat - это то, что отображается на экране блокировки, если в `` format`` не было сохранено никакого значения. Чтобы отобразить новое значение `` format``, метрику нужно обновить с помощью metric.update (x) `` (где x - это количество миллисекунд до обновления). Метрика будет сбрасываться каждый день обратно к значению, хранящемуся в ``emptyFormat.

Есть два способа обновления метрики:

  • Задайте в метрике определённое значение:

metricID.update (x) (где x - это число типа double, устанавливаемое для значения счетчика). metricID - это идентификатор, указанный в элементе Metric. Значение счетчика можно включить с помощью опции``format``с помощью переменной %1. Например ``format: «% 1 кнопки, которые были нажаты сегодня» ``

  • Увеличьте метрику:

metricID.increment(x) (где x - количество, которое нужно добавить к текущему счетчику)

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

Приложения используют эту систему, но устанавливают и обновляют «форматы» метрик пользователя, выполняя определенный код всякий раз, когда происходит определенное событие. Например, когда вы отправляете сообщение в Telegram, или когда вы получаете телефонный звонок. Приложение может хранить данные для манипуляции, но обычно данные хранятся в системе (/var/lib/usermetrics <https://github.com/ubports/libusermetrics/tree/xenial/doc/pages> _) .

(Простой пример можно посмотреть в этой статье)

Ограничения и особенности#

После регистрации метрика остается на экране блокировки даже после удаления приложения. Файл базы данных (db) хранится в папке /var/lib/usermetrics, который можно удалить только с правами root (команда sudo не поможет). Удаление этого файла и перезагрузка удалит все сохраненные метрики. Предположительно, файл db можно редактировать, а не удалять.

Исходя из того, как настроены «форматы», кажется, что трудно поддерживать текущее состояние более одного дня (хотя и невозможно. Подробнее см. главу FluffyChat).

Особенность приложения nCounter. Хочется посчитать количество дней, но поскольку метрика «сбрасывается» каждый день, это представляет проблему. Можно создать workaround, который обновляет метрику каждый раз, когда приложение открывается. Таким образом, emptyFormat (по умолчанию) говорит пользователю открыть приложение. Это, однако, почти полностью противоречит цели метрики пользователя, за исключением аккуратного напоминания о статистике за день.

Процесс должен запускаться независимо в фоновом режиме (например, cron) для извлечения данных из определенного кода приложения. Например, есть приложение Индикатор погоды. Оно запускает процесс каждые X минут для автоматического обновления индикатора погоды без необходимости открывать приложение.