Отправка In-App покупок на iOS

Для SDK AppMetrica версии 4.0 и выше доступен автоматический сбор данных о покупках внутри приложения. Для включения и выключения автосбора используется свойство revenueAutoTrackingEnabled.

Тестирование и ручная отправка информации о покупках

В AppMetrica нет возможности сегментировать Revenue на "тестовые" и "не тестовые". Если для отладки покупок вы используете основной API key, то тестовые покупки будут попадать в общую статистику. Поэтому, чтобы отладить отправку Revenue, используйте отправку статистики на дополнительный API key с помощью репортера. Подробнее о работе репортера в разделе Примеры использования.

Шаг 1. Создайте тестовое приложение в AppMetrica

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

Чтобы добавить еще одно приложение, нажмите кнопку Добавить приложение в выпадающем списке в интерфейсе AppMetrica.

Шаг 2. (Опционально) Включите валидацию

Для валидации покупок на iOS используются ресурсы iTunes API.

Чтобы включить валидацию:

  1. В интерфейсе AppMetrica перейдите в настройки приложения из меню слева.
  2. Перейдите на вкладку Revenue.
  3. В блоке Валидация покупок для App Store нажмите Включить валидацию.

Для валидации платных подписок на iOS используются ресурсы iTunes API и ключ Shared Secret.

Чтобы включить валидацию, создайте ключ и укажите его в настройках:

  1. В интерфейсе App Store Connect сгенерируйте ключ Shared Secret. Подробнее о генерации ключа в документации Apple.
  2. В интерфейсе AppMetrica перейдите в настройки приложения из меню слева.
  3. Перейдите на вкладку Revenue.
  4. Нажмите Автоматически продляемые подписки
  5. В блоке Валидация покупок для App Store укажите Shared Secret.
  6. Нажмите Валидировать подписки.

Внимание

При включенной валидации в отчете Revenue отображаются покупки, которые прошли валидацию или были отправлены без поля transactionID и receiptData.

Шаг 3. Протестируйте отправку Revenue

Ниже описаны этапы отправки Revenue на дополнительный API key:

Чтобы покупки на iOS валидировались, в собственной реализации завершения транзакции настройте отправку поля transactionID и receiptData:

  • Objective-C

    - (void)completeTransaction:(SKPaymentTransaction *)transaction
    {
        ...
        NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"2100.5"];
        // Initializing the Revenue instance.
        YMMMutableRevenueInfo *revenueInfo = [[YMMMutableRevenueInfo alloc] initWithPriceDecimal:price currency:@"BYN"];
        revenueInfo.productID = @"ru.yandex.nonconsumable.large-pack";
        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];
    }
    
  • Swift

    func completeTransaction(_ transaction: SKPaymentTransaction) {
        ...
        let price = NSDecimalNumber(string: "2100.5")
        // Initializing the Revenue instance.
        let revenueInfo = YMMMutableRevenueInfo.init(priceDecimal: price, currency: "BYN")
        revenueInfo.productID = "ru.yandex.nonconsumable.large-pack"
        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)
    }
    

Чтобы отправить информацию о покупке:

  • Objective-C

    NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"2100.5"];
    // Initializing the Revenue instance.
    YMMMutableRevenueInfo *revenueInfo = [[YMMMutableRevenueInfo alloc] initWithPriceDecimal:price currency:@"BYN"];
    revenueInfo.productID = @"ru.yandex.nonconsumable.large-pack";
    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);
    }];
    
  • Swift

    let price = NSDecimalNumber(string: "2100.5")
    // Initializing the Revenue instance.
    let revenueInfo = YMMMutableRevenueInfo.init(priceDecimal: price, currency: "BYN")
    revenueInfo.productID = "ru.yandex.nonconsumable.large-pack"
    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. Убедитесь, что покупки отображаются в отчетах

  1. Совершите тестовые покупки в приложении.

  2. Убедитесь, что в отчете Revenue количество покупок и общая выручка совпадает с отправленными.

    Информация в отчете может отсутствовать, если:

    • валидация включена и покупка не прошла валидацию;
    • информация о покупке не отправилась.
  3. Если в отчете нет данных, выгрузите все покупки с помощью ресурса Logs API:

    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'
    

    Если в выгрузке есть события и в поле is_revenue_verified указано значение false, то покупки не прошли валидацию.

Шаг 5. Настройте отправку Revenue на основной API Key

После отладки повторите последовательность шагов 2–4 для основного API key.

Чтобы отправить объект YMMMutableRevenueInfo на основной API key, используйте метод +reportRevenue:onFailure:/ reportRevenue(_:onFailure:) класса YMMYandexMetrica.

// ...
// Sending the Revenue instance.
YMMYandexMetrica.reportRevenue(revenueInfo, onFailure: { error in
    print("Revenue error: \(error)")
})
// ...
// Sending the Revenue instance.
YMMYandexMetrica.reportRevenue(revenueInfo, onFailure: { (error) in
    print("Revenue error: \(error)")
})

Если вы не нашли ответ на свой вопрос, то вы можете задать его через форму обратной связи. Пожалуйста, опишите возникшую проблему как можно подробнее. Если возможно, приложите скриншот.

Написать в службу поддержки