Отправка In-App покупок на iOS
Тестирование и ручная отправка информации о покупках
В AppMetrica нет возможности сегментировать Revenue на «тестовые» и «не тестовые». Если для отладки покупок вы используете основной API key, то тестовые покупки будут попадать в общую статистику. Поэтому, чтобы отладить отправку Revenue, используйте отправку статистики на дополнительный API key с помощью репортера. Подробнее о работе репортера в разделе Примеры использования.
Шаг 1. Создайте тестовое приложение в AppMetrica
Заполните параметры приложения: ссылка в магазине приложений (если приложение еще не опубликовано — оставьте поле пустым), название, категория, часовой пояс для построения отчетов.
Чтобы добавить еще одно приложение, нажмите кнопку Добавить приложение в выпадающем списке в интерфейсе AppMetrica.
Шаг 2. (Опционально) Включите валидацию
Для валидации покупок на iOS используются ресурсы iTunes API.
- В интерфейсе AppMetrica перейдите в настройки приложения из меню слева.
- Перейдите на вкладку Revenue.
- В блоке Валидация покупок для App Store нажмите Включить валидацию.
Для валидации платных подписок на iOS используются ресурсы iTunes API и ключ Shared Secret.
- В интерфейсе App Store Connect сгенерируйте ключ Shared Secret. Подробнее о генерации ключа в документации Apple.
- В интерфейсе AppMetrica перейдите в настройки приложения из меню слева.
- Перейдите на вкладку Revenue.
- Нажмите Автоматически продляемые подписки
- В блоке Валидация покупок для App Store укажите Shared Secret.
- Нажмите Валидировать подписки.
Шаг 3. Протестируйте отправку Revenue
Ниже описаны этапы отправки Revenue на дополнительный API key:
Чтобы покупки на iOS валидировались, в собственной реализации завершения транзакции настройте отправку поля transactionID и receiptData:
- (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]; }
Скопировано
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) }
Скопировано
Чтобы отправить информацию о покупке:
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); }];
Скопировано
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)") })
Скопировано
Шаг 4. Убедитесь, что покупки отображаются в отчетах
- Совершите тестовые покупки в приложении.
Убедитесь, что в отчете Revenue количество покупок и общая выручка совпадает с отправленными.
Информация в отчете может отсутствовать, если:
- валидация включена и покупка не прошла валидацию;
- информация о покупке не отправилась.
Если в отчете нет данных, выгрузите все покупки с помощью ресурса Logs API:
Если в выгрузке есть события и в поле is_revenue_verified указано значение false, то покупки не прошли валидацию.curl -X GET \ 'https://api.appmetrica.yandex.ru/logs/v1/export/revenue_events.json?application_id=1111&date_since=2018-10-10&date_until=2018-10-11&fields=revenue_order_id,revenue_quantity,revenue_price,revenue_currency,is_revenue_verified' \ -H 'Authorization: OAuth oauth_token'
Скопировано
Шаг 5. Настройте отправку Revenue на основной API Key
После отладки повторите последовательность шагов 2–4 для основного API key.
Чтобы отправить объект YMMMutableRevenueInfo
на основной API key, используйте метод +reportRevenue:onFailure: класса YMMYandexMetrica.
Чтобы отправить объект 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)") })
Скопировано