Примеры использования методов
- Инициализация библиотеки с расширенной конфигурацией
- Инициализация библиотеки для детских приложений
- Отправка статистики на дополнительный API key
- Отслеживание аварийных остановок приложения
- Определение местоположения
- Установка местоположения устройства вручную
- Отправка собственного события
- Отправка собственного события с вложенными параметрами
- Отправка события из JavaScript-кода WebView
- Отправка сообщения об ошибке
- Отправка атрибутов профиля
- Отправка ProfileId
- Отправка ECommerce-событий
- Отправка Revenue
- Установка длительности тайм-аута сессии
- Установка версии приложения
- Отслеживание открытий приложения с помощью deeplink
- Учет новых пользователей
- Отключение и включение отправки статистики
Инициализация библиотеки с расширенной конфигурацией
Чтобы инициализировать библиотеку с расширенной стартовой конфигурацией:
- Инициализируйте объект класса YMMYandexMetricaConfiguration.
- Задайте настройки конфигурации с помощью методов класса
YMMYandexMetricaConfiguration
. Например, включите логирование или установите тайм-аут сессии. - Передайте объект
YMMYandexMetricaConfiguration
в метод +activateWithConfiguration: класса YMMYandexMetrica.
Настройки расширенной конфигурации применяются с момента инициализации библиотеки. Чтобы настроить библиотеку в процессе работы приложения, используйте методы класса YMMYandexMetrica.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Setting up the configuration. For example, to enable logging. configuration.logs = YES; ... // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration]; }
Скопировано
Чтобы инициализировать библиотеку с расширенной стартовой конфигурацией:
- Инициализируйте объект класса YMMYandexMetricaConfiguration.
- Задайте настройки конфигурации с помощью методов класса
YMMYandexMetricaConfiguration
. Например, включите логирование или установите тайм-аут сессии.
Настройки расширенной конфигурации применяются с момента инициализации библиотеки. Чтобы настроить библиотеку в процессе работы приложения, используйте методы класса YMMYandexMetrica.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : AnyObject]? = nil) -> Bool { // Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Setting up the configuration. For example, to enable logging. configuration?.logs = true ... // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!) return true }
Скопировано
Инициализация библиотеки для детских приложений
Если ваше приложение относится к категории детских приложений, используйте свойство appForKids конфигурации YMMYandexMetricaConfiguration. Свойство определяет тип приложения как «детский», чтобы соответствовать правилам проверки детских приложений.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Setting up the configuration. configuration.appForKids = YES; ... // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration]; }
Скопировано
Если ваше приложение относится к категории детских приложений, используйте свойство appForKids конфигурации YMMYandexMetricaConfiguration. Свойство определяет тип приложения как «детский», чтобы соответствовать правилам проверки детских приложений.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : AnyObject]? = nil) -> Bool { // Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Setting up the configuration. configuration?.appForKids = true ... // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!) return true }
Скопировано
Отправка статистики на дополнительный API key
Отправка данных на дополнительный API key позволяет собирать для каждого API key свою статистику. Это можно использовать для управления доступом к информации. Например, чтобы предоставить доступ к статистике для аналитиков, можно продублировать отправку маркетинговых данных на дополнительный API key и предоставить им доступ к этой статистике. Так у них будет доступ только к той информации, которая им необходима.
Для отправки данных на дополнительный API key необходимо использовать репортеры. С помощью них можно отправлять события, сообщения об ошибках, профили и информацию о покупках в приложении. Репортеры могут работать без инициализации AppMetrica SDK.
Шаг 1. (Опционально) Инициализируйте репортер с расширенной конфигурацией
Чтобы инициализировать репортер с расширенной конфигурацией:
- Инициализируйте объект класса YMMReporterConfiguration.
- Задайте настройки конфигурации с помощью методов класса
YMMReporterConfiguration
. Например, включите логирование или установите тайм-аут сессии. - Передайте объект
YMMReporterConfiguration
в метод +activateReporterWithConfiguration: класса YMMYandexMetrica.
Конфигурация применяется для репортера с указанным API key. Для каждого дополнительного API key можно настроить свою конфигурацию.
// Creating an extended library configuration. // To create it, pass an API_key that is different from the app's API_key. YMMReporterConfiguration *reporterConfiguration = [[YMMReporterConfiguration alloc] initWithApiKey:@"API_key"]; // Setting up the configuration. For example, to enable logging. reporterConfiguration.logs = YES; ... // Initializing a reporter. [YMMYandexMetrica activateReporterWithConfiguration:[reporterConfiguration copy]];
Скопировано
Чтобы инициализировать репортер с расширенной конфигурацией:
- Инициализируйте объект класса YMMReporterConfiguration.
- Задайте настройки конфигурации с помощью методов класса
YMMReporterConfiguration
. Например, включите логирование или установите тайм-аут сессии.
Конфигурация применяется для репортера с указанным API key. Для каждого дополнительного API key можно настроить свою конфигурацию.
// Creating an extended library configuration. // To create it, pass an API_key that is different from the app's API_key. let reporterConfiguration = YMMReporterConfiguration.init(apiKey: "API key") // Setting up the configuration. For example, to enable logging. reporterConfiguration?.logs = true ... // Initializing a reporter. YMMYandexMetrica.activateReporter(with: reporterConfiguration!)
Скопировано
Шаг 2. Настройте отправку данных с помощью репортера
Чтобы отправить данные на другой API key:
- С помощью метода -reporterForApiKey: класса YMMYandexMetrica получите объект, который реализует протокол YMMYandexMetricaReporting.
Если репортер не был инициализирован с расширенной конфигурацией, то вызов данного метода произведет инициализацию репортера для указанного API key.
- Используйте методы протокола
YMMYandexMetricaReporting
для отправки ошибок, событий и Revenue. - Чтобы сессии отслеживались правильно, настройте отправку событий о начале и приостановке сессии для каждого репортера.
id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"API_key"]; [reporter resumeSession]; ... [reporter reportEvent:@"Updates installed" onFailure:^(NSError *error) { NSLog(@"REPORT ERROR: %@", [error localizedDescription]); }]; ... [reporter pauseSession];
Скопировано
Чтобы отправить данные на другой API key:
- С помощью метода reporterForApiKey(_:) класса YMMYandexMetrica получите объект, который реализует протокол YMMYandexMetricaReporting.
Если репортер не был инициализирован с расширенной конфигурацией, то вызов данного метода произведет инициализацию репортера для указанного API key.
- Используйте методы протокола
YMMYandexMetricaReporting
для отправки ошибок, событий и Revenue. - Чтобы сессии отслеживались правильно, настройте отправку событий о начале и приостановке сессии для каждого репортера.
let reporter = YMMYandexMetrica.reporterForApiKey("API_key") reporter.resumeSession() ... reporter.reportEvent("Updates installed", onFailure: { (error) in print("REPORT ERROR: %@", error?.localizedDescription) }) ... reporter.pauseSession()
Скопировано
Отслеживание аварийных остановок приложения
Отчеты об аварийных остановках приложения отправляются по умолчанию.
Чтобы отключить автоматическое отслеживание, инициализируйте библиотеку с конфигурацией, в которой отправка информации об аварийных остановках приложения отключена. Для этого установите значение NO
для свойства crashReporting конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Disabling sending the information on crashes of the application. configuration.crashReporting = NO; // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration];
Скопировано
Отчеты об аварийных остановках приложения отправляются по умолчанию.
Чтобы отключить автоматическое отслеживание, инициализируйте библиотеку с конфигурацией, в которой отправка информации об аварийных остановках приложения отключена. Для этого установите значение NO
для свойства crashReporting конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API_key") // Disabling sending the information on crashes of the application. configuration?.crashReporting = false // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!)
Скопировано
Определение местоположения
- С включенной опцией locationTracking
- Примечание.
Для iOS опция включена по умолчанию.
Местоположение определяется с точностью до города. Информация доступна в отчетах и в Logs API.
Приложение запрашивает доступ к GPS. Расход заряда аккумулятора может увеличиться.
- С отключенной опцией locationTracking
- Примечание.
Начиная с версии 5.0.0 AppMetrica Android SDK опция
locationTracking
по умолчанию отключена.Ниже версии 5.0.0 опция
locationTracking
по умолчанию включена.Местоположение определяется по IP-адресу с точностью до страны. Информация доступна в отчетах, но не доступна в Logs API.
Приложение не запрашивает доступ к GPS. Расход заряда аккумулятора не увеличивается.
Примечание. Если у вас включена маскировка IP-адреса, местоположение определяется так же с точностью до страны по немаскированной части IP-адреса.
По умолчанию AppMetrica SDK инициализируется с включенным locationTracking, но AppMetrica SDK не запрашивает разрешение на получение данных о местоположении. Это необходимо сделать самостоятельно с помощью методов класса CLLocationManager.
Чтобы инициализировать библиотеку с отключенным locationTracking, установите значение NO
для свойства locationTracking конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:API_key]; // Disabling sending information about the device location. configuration.locationTracking = NO; // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration];
Скопировано
Чтобы отключить locationTracking после инициализации библиотеки, используйте метод +setLocationTracking: класса YMMYandexMetrica:
[YMMYandexMetrica setTrackLocationEnabled:NO];
Скопировано
По умолчанию AppMetrica SDK инициализируется с включенным locationTracking, но AppMetrica SDK не запрашивает разрешение на получение данных о местоположении. Это необходимо сделать самостоятельно с помощью методов класса CLLocationManager.
Чтобы инициализировать библиотеку с отключенным locationTracking, установите значение false
для свойства locationTracking конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Disabling sending information about the location of the device. configuration?.locationTracking = false // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!)
Скопировано
Чтобы отключить locationTracking после инициализации библиотеки, используйте метод setLocationTracking(_:) класса YMMYandexMetrica:
YMMYandexMetrica.setLocationTracking(false)
Скопировано
Установка местоположения устройства вручную
Перед отправкой собственной информации о местоположении устройства убедитесь, что отправка отчетов была включена.
По умолчанию местоположение устройства определяется библиотекой.
Чтобы отправить собственную информацию о местоположении устройства, передайте объект CLLocation в метод +setLocation: класса YMMYandexMetrica.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { [YMMYandexMetrica setLocation:newLocation]; }
Скопировано
Чтобы отправить собственную информацию о местоположении устройства с помощью стартовой конфигурации, передайте объект CLLocation в свойство location конфигурации YMMYandexMetricaConfiguration.
Перед отправкой собственной информации о местоположении устройства убедитесь, что отправка отчетов была включена.
По умолчанию местоположение устройства определяется библиотекой.
Чтобы отправить собственную информацию о местоположении устройства, передайте объект CLLocation в метод setLocation(_:) класса YMMYandexMetrica.
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { YMMYandexMetrica.setLocation(locations.last) }
Скопировано
Чтобы отправить собственную информацию о местоположении устройства с помощью стартовой конфигурации, передайте объект CLLocation в свойство location конфигурации YMMYandexMetricaConfiguration.
Отправка собственного события
message
— короткое название или описание события;onFailure
— блок, в который передается ошибка. Если вы не хотите отслеживать ошибку, то передайте в качестве блока значениеnil
.
[YMMYandexMetrica reportEvent:@"Updates installed" onFailure:^(NSError *error) { NSLog(@"DID FAIL REPORT EVENT: %@", message); NSLog(@"REPORT ERROR: %@", [error localizedDescription]); }];
Скопировано
message
— короткое название или описание события;onFailure
— блок, в который передается ошибка. Если вы не хотите отслеживать ошибку, то передайте в качестве блока значениеnil
.
YMMYandexMetrica.reportEvent("Updates installed", onFailure: { (error) in print("DID FAIL REPORT EVENT: %@", message) print("REPORT ERROR: %@", error?.localizedDescription) }
Скопировано
Отправка собственного события с вложенными параметрами
message
— короткое название или описание события;params
— вложенные параметры в виде пар «ключ-значение»;Веб-интерфейс AppMetrica отображает до пяти уровней вложенности события. Если событие содержит шесть уровней и более, в отчете отобразятся пять верхних. С помощью API отчетов можно выгрузить до десяти уровней.
onFailure
— блок, в который передается ошибка. Если вы не хотите отслеживать ошибку, то передайте в качестве блока значениеnil
.
NSDictionary *params = @{@"key1": @"value1", @"key2": @"value2"}; [YMMYandexMetrica reportEvent:@"EVENT" parameters:params onFailure:^(NSError *error) { NSLog(@"error: %@", [error localizedDescription]); }];
Скопировано
message
— короткое название или описание события;params
— вложенные параметры в виде пар «ключ-значение»;Веб-интерфейс AppMetrica отображает до пяти уровней вложенности события. Если событие содержит шесть уровней и более, в отчете отобразятся пять верхних. С помощью API отчетов можно выгрузить до десяти уровней.
onFailure
— блок, в который передается ошибка. Если вы не хотите отслеживать ошибку, то передайте в качестве блока значениеnil
.
let params : [AnyHashable : Any] = ["key1": "value1", "key2": "value2"] YMMYandexMetrica.reportEvent("EVENT", parameters: params, onFailure: { (error) in print("DID FAIL REPORT EVENT: %@", message) print("REPORT ERROR: %@", error?.localizedDescription) })
Скопировано
Подробнее о событиях в разделе События.
Отправка события из JavaScript-кода WebView
AppMetrica SDK позволяет отправлять клиентские события из JavaScript-кода. Инициализируйте отправку вызовом метода initWebViewReporting
(Objective-C, Swift):
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; WKUserContentController *userController = [[WKUserContentController alloc] init]; [YMMYandexMetrica initWebViewReporting:userController onFailure:nil]; [userController addScriptMessageHandler:myHandler name:myScriptName]; configuration.userContentController = userController; WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
Скопировано
let configuration = WKWebViewConfiguration() let userController = WKUserContentController() YMMYandexMetrica.initWebViewReporting(userController, onFailure: nil) userController.add(myHandler, name: myScriptName) configuration.userContentController = userController; let webView = WKWebView(frame: .zero, configuration: configuration)
Скопировано
Метод необходимо вызывать до загрузки любого контента. Рекомендуется вызывать метод до создания вебвью и до добавления своих скриптов в WKUserContentController.
Для отправки события из JavaScript-кода используйте метод reportEvent(name, value)
интерфейса AppMetrica:
function buttonClicked() { AppMetrica.reportEvent('Button clicked!', '{}'); })
Скопировано
Аргументы метода reportEvent
:
name
— строка. Не может быть null или пустым.value
— JSON-строка. Может быть null.
Отправка сообщения об ошибке
Чтобы отправить собственное сообщение об ошибке, используйте методы класса YMMYandexMetrica и протокола YMMYandexMetricaReporting:
Для отправки можно использовать стандартный класс NSError, упрощенный класс YMMError или протокол YMMErrorRepresentable.
Пример c NSError
Если ошибки отправляются с использованием класса NSError, они группируются по домену domain и коду ошибки code.
NSError *firstError = [NSError errorWithDomain:@"com.yandex.error-a" code:12 userInfo:@{ YMMBacktraceErrorKey: NSThread.callStackReturnAddresses, NSLocalizedDescriptionKey: @"Error A" }]; [YMMYandexMetrica reportNSError:firstError onFailure:nil];
Скопировано
let firstError = NSError(domain: "com.yandex.error-a", code: 12, userInfo: [ YMMBacktraceErrorKey: Thread.callStackReturnAddresses, NSLocalizedDescriptionKey: "Error A" ]) YMMYandexMetrica.report(nserror: firstError, onFailure: nil)
Скопировано
Пример c YMMError
Если ошибки отправляются с использованием класса YMMError или протокола YMMErrorRepresentable, они группируются по идентификатору identifier.
YMMError *underlyingError = [YMMError errorWithIdentifier:@"Underlying YMMError"]; YMMError *error = [YMMError errorWithIdentifier:@"YMMError identifier" message:@"Another custom message" parameters:@{ @"foo": @"bar" } backtrace:NSThread.callStackReturnAddresses underlyingError:underlyingError]; [YMMYandexMetrica reportError:error onFailure:nil];
Скопировано
let underlyingError = YMMError.init(identifier: "Underlying YMMError") let error = YMMError( identifier: "YMMError identifier", message: "Another custom message", parameters: [ "foo": "bar" ], backtrace: Thread.callStackReturnAddresses, underlyingError: underlyingError) YMMYandexMetrica.report(error: error, onFailure: nil)
Скопировано
Не используйте переменные значения в качестве идентификатора для группировки. Иначе количество групп будет увеличиваться и их будет сложно анализировать.
Отправка атрибутов профиля
Чтобы отправить атрибуты профиля, передайте в метод +reportUserProfile:onFailure: класса YMMYandexMetrica следующие параметры:
userProfile
— объект YMMUserProfile, который содержит массив обновлений атрибутов. Атрибуты профиля создаются с помощью методов класса YMMProfileAttribute.onFailure
— блок, в который передается ошибка. Если вы не хотите отслеживать ошибку, то передайте в качестве блока значениеnil
.
YMMMutableUserProfile *profile = [[YMMMutableUserProfile alloc] init]; // Updating a single user profile attribute. id<YMMCustomCounterAttribute> timeLeftAttribute = [YMMProfileAttribute customCounter:@"time_left"]; [profile apply:[timeLeftAttribute withDelta:-4.42]]; // Updating multiple attributes. [profile applyFromArray:@[ // Updating predefined attributes. [[YMMProfileAttribute name] withValue:@"John"], [[YMMProfileAttribute gender] withValue:YMMGenderTypeMale], [[YMMProfileAttribute birthDate] withAge:24], [[YMMProfileAttribute notificationsEnabled] withValue:NO], // Updating custom attributes. [[YMMProfileAttribute customString:@"born_in"] withValueIfUndefined:@"Moscow"], [[YMMProfileAttribute customString:@"address"] withValueReset], [[YMMProfileAttribute customNumber:@"age"] withValue:24], [[YMMProfileAttribute customCounter:@"logins_count"] withDelta:1], [[YMMProfileAttribute customBool:@"has_premium"] withValue:YES] ]]; // ProfieID is set using the method of the YMMYandexMetrica class. [YMMYandexMetrica >setUserProfileID:@"id"]; // Sending profile attributes. [YMMYandexMetrica reportUserProfile:[profile copy] onFailure:^(NSError *error) { NSLog(@"Error: %@", error); }];
Скопировано
Чтобы отправить атрибуты профиля, передайте в метод reportUserProfile(_:onFailure:) класса YMMYandexMetrica следующие параметры:
userProfile
— объект YMMUserProfile, который содержит массив обновлений атрибутов. Атрибуты профиля создаются с помощью методов класса YMMProfileAttribute.onFailure
— блок, в который передается ошибка. Если вы не хотите отслеживать ошибку, то передайте в качестве блока значениеnil
.
let profile = YMMMutableUserProfile() // Updating a single user profile attribute. let timeLeftAttribute: YMMCustomCounterAttribute = YMMProfileAttribute.customCounter("time_left") profile.apply(timeLeftAttribute.withDelta(-4.42)) // Updating multiple attributes. profile.apply(from: [ // Updating predefined attributes. YMMProfileAttribute.name().withValue("John"), YMMProfileAttribute.gender().withValue(YMMGenderType.male), YMMProfileAttribute.birthDate().withAge(24), YMMProfileAttribute.notificationsEnabled().withValue(false), // Updating custom attributes. YMMProfileAttribute.customString("born_in").withValueIfUndefined("Moscow"), YMMProfileAttribute.customString("address").withValueReset(), YMMProfileAttribute.customNumber("age").withValue(24), YMMProfileAttribute.customCounter("logins_count").withDelta(1), YMMProfileAttribute.customBool("has_premium").withValue(true) ]) // ProfieID is set using the method of the YMMYandexMetrica class. YMMYandexMetrica.setUserProfileID("id") // Sending profile attributes. YMMYandexMetrica.report(profile, onFailure: { (error) in print("REPORT ERROR: %@", error.localizedDescription) })
Скопировано
Отправка ProfileId
Чтобы отправить ProfileId, используйте метод +setUserProfileID: класса YMMYandexMetrica.
Если отправка ProfileId не настроена, в веб-интерфейсе будет отображаться appmetrica_device_id
.
[YMMYandexMetrica setUserProfileID:@"id"];
Скопировано
Чтобы отправить ProfileId, используйте метод setUserProfileID(_:) класса YMMYandexMetrica.
Если отправка ProfileId не настроена, в веб-интерфейсе будет отображаться appmetrica_device_id
.
YMMYandexMetrica.setUserProfileID("id")
Скопировано
Отправка ECommerce-событий
В AppMetrica нет возможности сегментировать ECommerce-события на «тестовые» и «не тестовые». Если для отладки покупок вы используете основной API key, то тестовые события будут попадать в общую статистику. Поэтому, чтобы отладить отправку ECommerce-событий, используйте отправку статистики на дополнительный API key с помощью репортера.
Шаг 1. Настройте отправку ECommerce-событий на тестовый API key
Для различных действий пользователя есть соответствующие типы ECommerce-событий. Чтобы создать конкретный тип события, используйте нужный метод класса YMMECommerce.
Ниже приведены примеры отправки конкретных типов событий (Objective-C):
// Creating a screen object.
YMMECommerceScreen *screen = [[YMMECommerceScreen alloc] initWithName:@"ProductCardScreen"
categoryComponents:@[ @"Акции", @"Красная цена" ]
searchQuery:@"даниссимо кленовый сироп"
payload:@{ @"full_screen": @"true" }];
// Sending an e-commerce event.
id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"];
[reporter reportECommerce:[YMMECommerce showScreenEventWithScreen:screen] onFailure:nil];
// Creating a screen object. YMMECommerceScreen *screen = [[YMMECommerceScreen alloc] initWithName:@"ProductCardScreen" categoryComponents:@[ @"Акции", @"Красная цена" ] searchQuery:@"даниссимо кленовый сироп" payload:@{ @"full_screen": @"true" }]; // Creating an actualPrice object. YMMECommerceAmount *actualFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"4.53"]]; YMMECommerceAmount *woodActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30570000"]]; YMMECommerceAmount *ironActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.89"]]; YMMECommerceAmount *goldActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.1"]]; YMMECommercePrice *actualPrice = [[YMMECommercePrice alloc] initWithFiat:actualFiat internalComponents:@[ woodActualPrice, ironActualPrice, goldActualPrice ]]; // Creating an originalPrice object. YMMECommerceAmount *originalFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"5.78"]]; YMMECommerceAmount *woodOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30590000"]]; YMMECommerceAmount *ironOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.92"]]; YMMECommerceAmount *goldOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.5"]]; YMMECommercePrice *originalPrice = [[YMMECommercePrice alloc] initWithFiat:originalFiat internalComponents:@[ woodOriginalPrice, ironOriginalPrice, goldOriginalPrice ]]; // Creating a product object. YMMECommerceProduct *product = [[YMMECommerceProduct alloc] initWithSKU:@"779213" name:@"Продукт творожный «Даниссимо» 5.9%, 130 г." categoryComponents:@[ @"Продукты", @"Молочные продукты", @"Йогурты" ] payload:@{ @"full_screen" : @"true" } actualPrice:actualPrice originalPrice:originalPrice promoCodes:@[ @"BT79IYX", @"UT5412EP" ]]; // Sending an e-commerce event. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportECommerce:[YMMECommerce showProductCardEventWithProduct:product screen:screen] onFailure:nil];
Скопировано
// Creating a screen object. YMMECommerceScreen *screen = [[YMMECommerceScreen alloc] initWithName:@"ProductCardScreen" categoryComponents:@[ @"Акции", @"Красная цена" ] searchQuery:@"даниссимо кленовый сироп" payload:@{ @"full_screen": @"true" }]; // Creating an actualPrice object. YMMECommerceAmount *actualFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"4.53"]]; YMMECommerceAmount *woodActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30570000"]]; YMMECommerceAmount *ironActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.89"]]; YMMECommerceAmount *goldActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.1"]]; YMMECommercePrice *actualPrice = [[YMMECommercePrice alloc] initWithFiat:actualFiat internalComponents:@[ woodActualPrice, ironActualPrice, goldActualPrice ]]; // Creating an originalPrice object. YMMECommerceAmount *originalFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"5.78"]]; YMMECommerceAmount *woodOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30590000"]]; YMMECommerceAmount *ironOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.92"]]; YMMECommerceAmount *goldOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.5"]]; YMMECommercePrice *originalPrice = [[YMMECommercePrice alloc] initWithFiat:originalFiat internalComponents:@[ woodOriginalPrice, ironOriginalPrice, goldOriginalPrice ]]; // Creating a product object. YMMECommerceProduct *product = [[YMMECommerceProduct alloc] initWithSKU:@"779213" name:@"Продукт творожный «Даниссимо» 5.9%, 130 г." categoryComponents:@[ @"Продукты", @"Молочные продукты", @"Йогурты" ] payload:@{ @"full_screen" : @"true" } actualPrice:actualPrice originalPrice:originalPrice promoCodes:@[ @"BT79IYX", @"UT5412EP" ]]; // Creating a referrer object. YMMECommerceReferrer *referrer = [[YMMECommerceReferrer alloc] initWithType:@"button" identifier:@"76890" screen:screen]; // Sending an e-commerce event. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportECommerce:[YMMECommerce showProductDetailsEventWithProduct:product referrer:referrer] onFailure:nil];
Скопировано
// Creating a screen object. YMMECommerceScreen *screen = [[YMMECommerceScreen alloc] initWithName:@"ProductCardScreen" categoryComponents:@[ @"Акции", @"Красная цена" ] searchQuery:@"даниссимо кленовый сироп" payload:@{ @"full_screen": @"true" }]; // Creating an actualPrice object. YMMECommerceAmount *actualFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"4.53"]]; YMMECommerceAmount *woodActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30570000"]]; YMMECommerceAmount *ironActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.89"]]; YMMECommerceAmount *goldActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.1"]]; YMMECommercePrice *actualPrice = [[YMMECommercePrice alloc] initWithFiat:actualFiat internalComponents:@[ woodActualPrice, ironActualPrice, goldActualPrice ]]; // Creating an originalPrice object. YMMECommerceAmount *originalFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"5.78"]]; YMMECommerceAmount *woodOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30590000"]]; YMMECommerceAmount *ironOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.92"]]; YMMECommerceAmount *goldOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.5"]]; YMMECommercePrice *originalPrice = [[YMMECommercePrice alloc] initWithFiat:originalFiat internalComponents:@[ woodOriginalPrice, ironOriginalPrice, goldOriginalPrice ]]; // Creating a product object. YMMECommerceProduct *product = [[YMMECommerceProduct alloc] initWithSKU:@"779213" name:@"Продукт творожный «Даниссимо» 5.9%, 130 г." categoryComponents:@[ @"Продукты", @"Молочные продукты", @"Йогурты" ] payload:@{ @"full_screen" : @"true" } actualPrice:actualPrice originalPrice:originalPrice promoCodes:@[ @"BT79IYX", @"UT5412EP" ]]; // Creating a referrer object. YMMECommerceReferrer *referrer = [[YMMECommerceReferrer alloc] initWithType:@"button" identifier:@"76890" screen:screen]; // Creating a cartItem object. NSDecimalNumber *quantity = [NSDecimalNumber decimalNumberWithString:@"1"]; YMMECommerceCartItem *addedItems = [[YMMECommerceCartItem alloc] initWithProduct:product referrer:referrer quantity:quantity revenue:actualPrice]; // Sending an e-commerce event. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportECommerce:[YMMECommerce addCartItemEvent:addedItems] onFailure:nil]; // Or: [YMMYandexMetrica reportECommerce:[YMMECommerce removeCartItemEventWithItem:addedItems] onFailure:nil];
Скопировано
// Creating a screen object. YMMECommerceScreen *screen = [[YMMECommerceScreen alloc] initWithName:@"ProductCardScreen" categoryComponents:@[ @"Акции", @"Красная цена" ] searchQuery:@"даниссимо кленовый сироп" payload:@{ @"full_screen": @"true" }]; // Creating an actualPrice object. YMMECommerceAmount *actualFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"4.53"]]; YMMECommerceAmount *woodActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30570000"]]; YMMECommerceAmount *ironActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.89"]]; YMMECommerceAmount *goldActualPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.1"]]; YMMECommercePrice *actualPrice = [[YMMECommercePrice alloc] initWithFiat:actualFiat internalComponents:@[ woodActualPrice, ironActualPrice, goldActualPrice ]]; // Creating an originalPrice object. YMMECommerceAmount *originalFiat = [[YMMECommerceAmount alloc] initWithUnit:@"USD" value:[NSDecimalNumber decimalNumberWithString:@"5.78"]]; YMMECommerceAmount *woodOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"wood" value:[NSDecimalNumber decimalNumberWithString:@"30590000"]]; YMMECommerceAmount *ironOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"iron" value:[NSDecimalNumber decimalNumberWithString:@"26.92"]]; YMMECommerceAmount *goldOriginalPrice = [[YMMECommerceAmount alloc] initWithUnit:@"gold" value:[NSDecimalNumber decimalNumberWithString:@"5.5"]]; YMMECommercePrice *originalPrice = [[YMMECommercePrice alloc] initWithFiat:originalFiat internalComponents:@[ woodOriginalPrice, ironOriginalPrice, goldOriginalPrice ]]; // Creating a product object. YMMECommerceProduct *product = [[YMMECommerceProduct alloc] initWithSKU:@"779213" name:@"Продукт творожный «Даниссимо» 5.9%, 130 г." categoryComponents:@[ @"Продукты", @"Молочные продукты", @"Йогурты" ] payload:@{ @"full_screen" : @"true" } actualPrice:actualPrice originalPrice:originalPrice promoCodes:@[ @"BT79IYX", @"UT5412EP" ]]; // Creating a referrer object. YMMECommerceReferrer *referrer = [[YMMECommerceReferrer alloc] initWithType:@"button" identifier:@"76890" screen:screen]; // Creating a cartItem object. NSDecimalNumber *quantity = [NSDecimalNumber decimalNumberWithString:@"1"]; YMMECommerceCartItem *addedItems = [[YMMECommerceCartItem alloc] initWithProduct:product referrer:referrer quantity:quantity revenue:actualPrice]; // Creating an order object. YMMECommerceOrder *order = [[YMMECommerceOrder alloc] initWithIdentifier:@"88528768" cartItems:@[ addedItems ] payload:@{ @"black_friday" : @"true"}]; // Sending an e-commerce event. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportECommerce:[YMMECommerce beginCheckoutEventWithOrder:order] onFailure:nil]; [YMMYandexMetrica reportECommerce:[YMMECommerce purchaseEventWithOrder:order] onFailure:nil];
Скопировано
Для различных действий пользователя есть соответствующие типы ECommerce-событий. Чтобы создать конкретный тип события, используйте нужный метод класса YMMECommerce.
Ниже приведены примеры отправки конкретных типов событий (Swift):
// Creating a screen object.
let screen = YMMECommerceScreen(
name: "ProductCardScreen",
categoryComponents: ["Акции", "Красная цена"],
searchQuery: "даниссимо кленовый сироп",
payload: ["full_screen": "true"]
)
// Sending an e-commerce event.
YMMYandexMetrica.report(eCommerce: .showScreenEvent(screen: screen), onFailure: nil)
// Creating a screen object. let screen = YMMECommerceScreen( name: "ProductCardScreen", categoryComponents: ["Акции", "Красная цена"], searchQuery: "даниссимо кленовый сироп", payload: ["full_screen": "true"] ) // Creating an actualPrice object. let actualPrice = YMMECommercePrice( fiat: .init(unit: "USD", value: .init(string: "4.53")), internalComponents: [ .init(unit: "wood", value: .init(string: "30570000")), .init(unit: "iron", value: .init(string: "26.89")), .init(unit: "gold", value: .init(string: "5.1")), ] ) // Creating a product object. let product = YMMECommerceProduct( sku: "779213", name: "Продукт творожный «Даниссимо» 5.9%, 130 г.", categoryComponents: ["Продукты", "Молочные продукты", "Йогурты"], payload: ["full_screen": "true"], actualPrice: actualPrice, originalPrice: .init( fiat: .init(unit: "USD", value: .init(string: "5.78")), internalComponents: [ .init(unit: "wood", value: .init(string: "30590000")), .init(unit: "iron", value: .init(string: "26.92")), .init(unit: "gold", value: .init(string: "5.5")), ] ), promoCodes: ["BT79IYX", "UT5412EP"] ) // Sending an e-commerce event. YMMYandexMetrica.report(eCommerce: .showProductCardEvent(product: product, screen: screen), onFailure: nil)
Скопировано
// Creating a screen object. let screen = YMMECommerceScreen( name: "ProductCardScreen", categoryComponents: ["Акции", "Красная цена"], searchQuery: "даниссимо кленовый сироп", payload: ["full_screen": "true"] ) // Creating an actualPrice object. let actualPrice = YMMECommercePrice( fiat: .init(unit: "USD", value: .init(string: "4.53")), internalComponents: [ .init(unit: "wood", value: .init(string: "30570000")), .init(unit: "iron", value: .init(string: "26.89")), .init(unit: "gold", value: .init(string: "5.1")), ] ) // Creating a product object. let product = YMMECommerceProduct( sku: "779213", name: "Продукт творожный «Даниссимо» 5.9%, 130 г.", categoryComponents: ["Продукты", "Молочные продукты", "Йогурты"], payload: ["full_screen": "true"], actualPrice: actualPrice, originalPrice: .init( fiat: .init(unit: "USD", value: .init(string: "5.78")), internalComponents: [ .init(unit: "wood", value: .init(string: "30590000")), .init(unit: "iron", value: .init(string: "26.92")), .init(unit: "gold", value: .init(string: "5.5")), ] ), promoCodes: ["BT79IYX", "UT5412EP"] ) // Creating a referrer object. let referrer = YMMECommerceReferrer(type: "button", identifier: "76890", screen: screen) // Sending an e-commerce event. YMMYandexMetrica.report(eCommerce: .showProductDetailsEvent(product: product, referrer: referrer), onFailure: nil)
Скопировано
// Creating a screen object. let screen = YMMECommerceScreen( name: "ProductCardScreen", categoryComponents: ["Акции", "Красная цена"], searchQuery: "даниссимо кленовый сироп", payload: ["full_screen": "true"] ) // Creating an actualPrice object. let actualPrice = YMMECommercePrice( fiat: .init(unit: "USD", value: .init(string: "4.53")), internalComponents: [ .init(unit: "wood", value: .init(string: "30570000")), .init(unit: "iron", value: .init(string: "26.89")), .init(unit: "gold", value: .init(string: "5.1")), ] ) // Creating a product object. let product = YMMECommerceProduct( sku: "779213", name: "Продукт творожный «Даниссимо» 5.9%, 130 г.", categoryComponents: ["Продукты", "Молочные продукты", "Йогурты"], payload: ["full_screen": "true"], actualPrice: actualPrice, originalPrice: .init( fiat: .init(unit: "USD", value: .init(string: "5.78")), internalComponents: [ .init(unit: "wood", value: .init(string: "30590000")), .init(unit: "iron", value: .init(string: "26.92")), .init(unit: "gold", value: .init(string: "5.5")), ] ), promoCodes: ["BT79IYX", "UT5412EP"] ) // Creating a referrer object. let referrer = YMMECommerceReferrer(type: "button", identifier: "76890", screen: screen) // Creating a cartItem object. let addedItems = YMMECommerceCartItem( product: product, referrer: referrer, quantity: .init(string: "1"), revenue: actualPrice ) // Sending an e-commerce event. YMMYandexMetrica.report(eCommerce: .addCartItemEvent(cartItem: addedItems), onFailure: nil) // Or: YMMYandexMetrica.report(eCommerce: .removeCartItemEvent(cartItem: addedItems), onFailure: nil)
Скопировано
// Creating a screen object. let screen = YMMECommerceScreen( name: "ProductCardScreen", categoryComponents: ["Акции", "Красная цена"], searchQuery: "даниссимо кленовый сироп", payload: ["full_screen": "true"] ) // Creating an actualPrice object. let actualPrice = YMMECommercePrice( fiat: .init(unit: "USD", value: .init(string: "4.53")), internalComponents: [ .init(unit: "wood", value: .init(string: "30570000")), .init(unit: "iron", value: .init(string: "26.89")), .init(unit: "gold", value: .init(string: "5.1")), ] ) // Creating a product object. let product = YMMECommerceProduct( sku: "779213", name: "Продукт творожный «Даниссимо» 5.9%, 130 г.", categoryComponents: ["Продукты", "Молочные продукты", "Йогурты"], payload: ["full_screen": "true"], actualPrice: actualPrice, originalPrice: .init( fiat: .init(unit: "USD", value: .init(string: "5.78")), internalComponents: [ .init(unit: "wood", value: .init(string: "30590000")), .init(unit: "iron", value: .init(string: "26.92")), .init(unit: "gold", value: .init(string: "5.5")), ] ), promoCodes: ["BT79IYX", "UT5412EP"] ) // Creating a referrer object. let referrer = YMMECommerceReferrer(type: "button", identifier: "76890", screen: screen) // Creating a cartItem object. let addedItems = YMMECommerceCartItem( product: product, referrer: referrer, quantity: .init(string: "1"), revenue: actualPrice ) // Creating an order object. let order = YMMECommerceOrder( identifier: "88528768", cartItems: [addedItems], payload: ["black_friday": "true"] ) // Sending an e-commerce event. YMMYandexMetrica.report(eCommerce: .beginCheckoutEvent(order:order), onFailure: nil) YMMYandexMetrica.report(eCommerce: .purchaseEvent(order: order), onFailure: nil)
Скопировано
Шаг 2. Проверьте отчет тестового приложения
Совершите тестовые покупки в приложении. Через некоторое время в интерфейсе AppMetrica проверьте отчет «Анализ покупок». Убедитесь, что ECommerce-события отображаются в отчете.
Подробнее об отчете в разделе Анализ покупок.
Шаг 3. Настройте отправку на основной API key
После успешного тестирования настройте отправку ECommerce-событий на основной API key.
Чтобы отправить объект YMMECommerce на основной API key, используйте метода +reportECommerce:onFailure: класса YMMYandexMetrica.
... // Sending an e-commerce event. [YMMYandexMetrica reportECommerce:[YMMECommerce showScreenEventWithScreen:screen] onFailure:nil];
Скопировано
... // Sending an e-commerce event. YMMYandexMetrica.report(eCommerce: .showScreenEvent(screen: screen), onFailure: nil)
Скопировано
Отправка Revenue
AppMetrica поддерживает валидацию покупок, которые реализованы с помощью библиотеки StoreKit. Валидация позволяет фильтровать покупки, которые совершаются из взломанных приложений. Если валидация включена и покупка не проходит валидацию, она не отображается в отчетах.
Шаг 1. Протестируйте отправку Revenue
В AppMetrica нет возможности сегментировать Revenue на «тестовые» и «не тестовые». Если для отладки покупок вы используете основной API key, то тестовые покупки будут попадать в общую статистику. Поэтому, чтобы отладить отправку Revenue, используйте отправку статистики на дополнительный API key с помощью репортера.
Ниже описаны этапы отправки Revenue на дополнительный API key:
Чтобы покупки на iOS валидировались, в собственной реализации завершения транзакции настройте отправку поля transactionID и receiptData:
- Инициализируйте объект YMMMutableRevenueInfo.
- Для валидации покупки укажите transactionID и receiptData. Их необходимо получить до вызова
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]
. - Отправьте объект
YMMMutableRevenueInfo
на тестовый API key с помощью репортера YMMYandexMetricaReporting. Подробнее о работе репортеров в разделе Отправка статистики на дополнительный API key.
- (void)completeTransaction:(SKPaymentTransaction *)transaction { ... NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"2100.5"]; // Initializing the Revenue instance. YMMMutableRevenueInfo *revenueInfo = [[YMMMutableRevenueInfo alloc] initWithPriceDecimal:price currency:@"BYN"]; revenueInfo.productID = @"TV soundbar"; revenueInfo.quantity = 2; revenueInfo.payload = @{ @"source": @"AppStore" }; // Set purchase information for validation. revenueInfo.transactionID = transaction.transactionIdentifier; revenueInfo.receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; // Sending the Revenue instance using reporter. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportRevenue:[revenueInfo copy] onFailure:^(NSError *error) { NSLog(@"Revenue error: %@", error); }]; // Remove the transaction from the payment queue. [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; }
Скопировано
Чтобы отправить информацию о покупке:
- Инициализируйте объект YMMMutableRevenueInfo.
- (Опционально) Чтобы группировать покупки по OrderID, укажите его в свойстве payload.Примечание. Если идентификатор OrderID не указан, AppMetrica генерирует идентификатор автоматически.
- Отправьте объект
YMMMutableRevenueInfo
на тестовый API key с помощью репортера YMMYandexMetricaReporting. Подробнее о работе репортеров в разделе Отправка статистики на дополнительный API key.
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"2100.5"]; // Initializing the Revenue instance. YMMMutableRevenueInfo *revenueInfo = [[YMMMutableRevenueInfo alloc] initWithPriceDecimal:price currency:@"BYN"]; revenueInfo.productID = @"TV soundbar"; revenueInfo.quantity = 2; // Setting the OrderID parameter in the payload property to group purchases revenueInfo.payload = @{ @"OrderID": @"Identifier", @"source": @"AppStore" }; // Sending the Revenue instance using reporter. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportRevenue:[revenueInfo copy] onFailure:^(NSError *error) { NSLog(@"Revenue error: %@", error); }];
Скопировано
В AppMetrica нет возможности сегментировать Revenue на «тестовые» и «не тестовые». Если для отладки покупок вы используете основной API key, то тестовые покупки будут попадать в общую статистику. Поэтому, чтобы отладить отправку Revenue, используйте отправку статистики на дополнительный API key с помощью репортера.
Ниже описаны этапы отправки Revenue на дополнительный API key:
Чтобы покупки на iOS валидировались, в собственной реализации завершения транзакции настройте отправку поля transactionID и receiptData:
- Инициализируйте объект YMMMutableRevenueInfo.
- Для валидации покупки укажите transactionID и receiptData. Их необходимо получить до вызова
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]
. - Отправьте объект
YMMMutableRevenueInfo
на тестовый API key с помощью репортера YMMYandexMetricaReporting. Подробнее о работе репортеров в разделе Отправка статистики на дополнительный API key.
func completeTransaction(_ transaction: SKPaymentTransaction) { ... let price = NSDecimalNumber(string: "2100.5") // Initializing the Revenue instance. let revenueInfo = YMMMutableRevenueInfo.init(priceDecimal: price, currency: "BYN") revenueInfo.productID = "TV soundbar" revenueInfo.quantity = 2 revenueInfo.payload = ["source": "AppStore"] // Set purchase information for validation. if let url = Bundle.main.appStoreReceiptURL, let data = try? Data(contentsOf: url), let transactionID = transaction.transactionIdentifier { revenueInfo.transactionID = transactionID revenueInfo.receiptData = data } // Sending the Revenue instance using reporter. let reporter = YMMYandexMetrica.reporterForApiKey("API_key") reporter.reportRevenue(revenueInfo, onFailure: { (error) in print("REPORT ERROR: \(error.localizedDescription)") }) // Remove the transaction from the payment queue. SKPaymentQueue.default().finishTransaction(transaction) }
Скопировано
Чтобы отправить информацию о покупке:
- Инициализируйте объект YMMMutableRevenueInfo.
- (Опционально) Чтобы группировать покупки по OrderID, укажите его в свойстве payload.Примечание. Если идентификатор OrderID не указан, AppMetrica генерирует идентификатор автоматически.
- Отправьте объект
YMMMutableRevenueInfo
на тестовый API key с помощью репортера YMMYandexMetricaReporting. Подробнее о работе репортеров в разделе Отправка статистики на дополнительный API key.
let price = NSDecimalNumber(string: "2100.5") // Initializing the Revenue instance. let revenueInfo = YMMMutableRevenueInfo.init(priceDecimal: price, currency: "BYN") revenueInfo.productID = "TV soundbar" revenueInfo.quantity = 2 // To group purchases, set the OrderID parameter in the payload property. revenueInfo.payload = ["OrderID": "Identifier", "source": "AppStore"] // Sending the Revenue instance using reporter. let reporter = YMMYandexMetrica.reporterForApiKey("API_key") reporter.reportRevenue(revenueInfo, onFailure: { (error) in print("REPORT ERROR: \(error.localizedDescription)") })
Скопировано
Шаг 2. Настройте отправку Revenue на основной API key
После успешного тестирования настройте отправку Revenue на основной API key.
Чтобы отправить объект YMMMutableRevenueInfo
на основной API key, используйте метод +reportRevenue:onFailure: класса YMMYandexMetrica.
... // Sending the Revenue instance. YMMYandexMetrica.reportRevenue(revenueInfo, onFailure: { error in print("Revenue error: \(error)") })
Скопировано
Чтобы отправить объект YMMMutableRevenueInfo
на основной API key, используйте метод reportRevenue(_:onFailure:) класса YMMYandexMetrica.
... // Sending the Revenue instance. YMMYandexMetrica.reportRevenue(revenueInfo, onFailure: { (error) in print("Revenue error: \(error)") })
Скопировано
Установка длительности тайм-аута сессии
Чтобы изменить длительность тайм-аута, передайте значение в секундах в свойство sessionTimeout конфигурации YMMYandexMetricaConfiguration.
По умолчанию длительность тайм-аута сессии равна 10 секундам. Это минимально допустимое значение свойства sessionTimeout
.
// Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Setting the session timeout. configuration.sessionTimeout = 15; // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration];
Скопировано
Чтобы изменить длительность тайм-аута, передайте значение в секундах в свойство sessionTimeout конфигурации YMMYandexMetricaConfiguration.
По умолчанию длительность тайм-аута сессии равна 10 секундам. Это минимально допустимое значение свойства sessionTimeout
.
// Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Setting the session timeout. configuration?.sessionTimeout = 15 // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!)
Скопировано
Установка версии приложения
По умолчанию версия приложения задается в файле Info.plist (CFBundleShortVersionString)
.
Чтобы указать версию приложения из кода, передайте версию приложения в свойство appVersion конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Setting the app version. configuration.appVersion = @"1.13.2"; // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration];
Скопировано
По умолчанию версия приложения задается в файле Info.plist (CFBundleShortVersionString)
.
Чтобы указать версию приложения из кода, передайте версию приложения в свойство appVersion конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Setting the app version. configuration?.appVersion = "1.13.2" // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!)
Скопировано
Отслеживание открытий приложения с помощью deeplink
Отслеживание открытий необходимо для корректного трекинга ремаркетинг-кампаний.
Чтобы отслеживать открытия приложения с помощью deeplink или Universal Links, используйте метод +handleOpenURL: класса YMMYandexMetrica.
Чтобы отслеживать открытия приложения с помощью deeplink, необходимо в UIApplicationDelegate
добавить следующие изменения:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [YMMYandexMetrica handleOpenURL:url]; } - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [YMMYandexMetrica handleOpenURL:url]; } // Delegate for tracking Universal links. - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { [YMMYandexMetrica handleOpenURL:userActivity.webpageURL]; } return YES; }
Скопировано
Отслеживание открытий необходимо для корректного трекинга ремаркетинг-кампаний.
Чтобы отслеживать открытия приложения с помощью deeplink или Universal Links, используйте метод handleOpen(_:) класса YMMYandexMetrica.
Чтобы отслеживать открытия приложения с помощью deeplink, необходимо в UIApplicationDelegate
добавить следующие изменения:
func application(_ application: UIApplication, handleOpenURL url: URL) -> Bool { return YMMYandexMetrica.handleOpen(url) } func application(_ application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool { return YMMYandexMetrica.handleOpen(url) } // Delegate for tracking Universal links. func application(_ application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb { if let url = userActivity.webpageURL { YMMYandexMetrica.handleOpen(url) } } return true }
Скопировано
Учет новых пользователей
По умолчанию в момент первого запуска приложения все пользователи определяются как новые. Если AppMetrica SDK подключается к приложению, у которого уже есть активные пользователи, то для корректного отслеживания статистики можно настроить учет новых и старых пользователей. Для этого необходимо инициализировать AppMetrica SDK, используя расширенную стартовую конфигурацию YMMYandexMetricaConfiguration
.
BOOL isFirstLaunch = NO; // Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Implement the logic for detecting whether the app is starting for the first time. // For example, you can check for files (settings, databases, and so on), // which the app creates on its first launch. if (conditions) { isFirstLaunch = YES; } configuration.handleFirstActivationAsUpdate = !isFirstLaunch; // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration];
Скопировано
var isFirstLaunch = false // Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Implement the logic for detecting whether the app is starting for the first time. // For example, you can check for files (settings, databases, and so on), // which the app creates on its first launch. if conditions { isFirstLaunch = true } configuration?.handleFirstActivationAsUpdate = !isFirstLaunch // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!)
Скопировано
Отключение и включение отправки статистики
Если для отправки статистических данных требуется согласие пользователя, необходимо инициализировать библиотеку с отключенной опцией отправки статистики. Для этого установите значение NO
для свойства statisticsSending конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"API_key"]; // Disabling sending statistics. configuration.statisticsSending = NO; // Initializing the AppMetrica SDK. [YMMYandexMetrica activateWithConfiguration:configuration];
Скопировано
// Checking the status of the boolean variable. It shows the user confirmation. if (flag) { // Enabling sending statistics. [YMMYandexMetrica setStatisticsSending:YES]; }
Скопировано
Если для отправки статистических данных требуется согласие пользователя, необходимо инициализировать библиотеку с отключенной опцией отправки статистики. Для этого установите значение NO
для свойства statisticsSending конфигурации YMMYandexMetricaConfiguration.
// Creating an extended library configuration. let configuration = YMMYandexMetricaConfiguration.init(apiKey: "API key") // Disabling sending statistics. configuration?.statisticsSending = false // Initializing the AppMetrica SDK. YMMYandexMetrica.activate(with: configuration!)
Скопировано
// Checking the status of the boolean variable. It shows the user confirmation. if flag { // Enabling sending statistics. YMMYandexMetrica.setStatisticsSending(true); }
Скопировано
Пример оповещения
Для информирования пользователей вы можете использовать любой текст. Например:
Это приложение использует сервис аналитики AppMetrica (Яндекс.Метрика для приложений), предоставляемый компанией ООО «ЯНДЕКС», 119021, Россия, Москва, ул. Л. Толстого, 16 (далее — Яндекс) на Условиях использования сервиса.
AppMetrica анализирует данные об использовании приложения, в том числе об устройстве, на котором оно функционирует, источнике установки, составляет конверсию и статистику вашей активности в целях продуктовой аналитики, анализа и оптимизации рекламных кампаний, а также для устранения ошибок. Собранная таким образом информация не может идентифицировать вас.
Информация об использовании вами данного приложения, собранная при помощи инструментов AppMetrica, в обезличенном виде будет передаваться Яндексу и храниться на сервере Яндекса в ЕС и Российской Федерации. Яндекс будет обрабатывать эту информацию для предоставления статистики использования вами приложения, составления для нас отчетов о работе приложения, и предоставления других услуг.