Есть ли способ получить уведомление, когда кто-то делает покупку в приложении?

Я хотел бы получать уведомления о том, что кто-то делает покупку In-App в моем приложении, а не ждет, пока на следующий день не будет проверять iTunes Connect, чтобы увидеть, нет ли у меня каких-либо продаж.

Кто-нибудь знает, как это сделать? Если нет, было бы здорово!

Спасибо

Ответы

Ответ 1

Добавьте в свой проект Parse. Для этого следуйте краткому руководству: https://parse.com/apps/quickstart#parse_data/mobile/ios/native/existing

После настройки синтаксиса добавьте PFObject *testObject = [PFObject objectWithClassName:@"TestObject"]; testObject[@"foo"] = @"bar"; [testObject saveInBackground]; к вашему полному коду трансляции для каждой покупки в приложении. Например:

- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");

[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
// NEW CODE
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iapra"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"No" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iap"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"YES" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iap"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"YES" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iap"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"YES" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iap"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"YES" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iap"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"YES" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
if ([transaction.payment.productIdentifier isEqualToString:@"company.app.iap"]){
    [[NSUserDefaults standardUserDefaults] setObject: @"YES" forKey:KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    PFObject *testObject = [PFObject objectWithClassName:@"IAP"];
    testObject[@"TEST"] = @"Purchase Successful";
    [testObject saveInBackground];
}
// NEW CODE ^^

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

Не забудьте добавить #import <Parse/Parse.h> в начало файла header.h.

Я не совсем уверен, что есть другие методы, вроде этого. Это довольно круто, поэтому наслаждайтесь и получайте удовольствие от просмотра уведомлений о покупке в приложении в реальном времени!

Ответ 2

События для отслеживания StoreKit

Когда происходит покупка, отправьте себе datapoint (Отслеживайте здесь...)

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transation in transactions {
        switch transation.transactionState {

            case .purchased:
                queue.finishTransaction(transation)
                // Track here...

            case .purchasing: break
            case .restored: break
            case .deferred: break
            case .failed: break
        }
    }
}

Библиотеки рычагов

Используйте аналитику. Замените комментарий // Track here... выше любым из следующих блоков. Не исчерпывающий список в алфавитном порядке:

Accengage

NSString *currencyCode = [<SKProduct.priceLocale>
                          objectForKey:NSLocaleCurrencyCode];
BMA4SPurchasedItem* item =
    [BMA4SPurchasedItem itemWithId(t.payment.productIdentifier)
        label:t.payment.productName
        category:<product.type>
        price:@(<SKProduct.price>)
        quantity:t.payment.quantity
];
[BMA4STracker trackPurchaseWithId:transaction.identifier
                         currency:currencyCode
                            items:@[item]];

Branch

NSDictionary *state = @{ 
    @"itemId": @(t.payment.productIdentifier),
    @"price": <SKProduct.price>, 
    @"itemName": <SKProduct.name>, 
    @"currency":currencyCode };
[[Branch getInstance] userCompletedAction:@"purchase" withState:state];

Ткань (Crashlytics)

NSString *currencyCode = [<SKProduct.priceLocale>
                          objectForKey:NSLocaleCurrencyCode];
[Answers logPurchaseWithPrice:<SKProduct.price>
                     currency:currencyCode
                      success:@YES
                     itemName:<product name>
                     itemType:@"Purchase"
                       itemId:@(t.payment.productIdentifier)
             customAttributes:@{}];

FlightRecorder

FlightRecorder.sharedInstance().trackEventWithCategory(
    "Actions",
    action: "Purchase",
    label: "productIdentifier",
    value: t.payment.productIdentifier)

Flurry Analytics

let properties = ["productIdentifier":t.payment.productIdentifier]
Flurry.logEvent("Purchase", withParameters: properties)

Google Analytics

#import "GAI.h"
#import "GAIDictionaryBuilder.h"

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
NSString *currencyCode = [<SKProduct.priceLocale>
                          objectForKey:NSLocaleCurrencyCode];
[tracker send:[[GAIDictionaryBuilder
                createItemWithTransactionId:transactionIdentifier
                name:<product.localizedTitle>
                sku:t.payment.productIdentifier
                category:@"Purchase"
                price:<SKProduct.price>
                quantity:@(t.payment.quantity)
                currencyCode:currencyCode]
               build]];

Посмотрите отслеживание покупок в приложении с помощью SDK Google Analytics iOS.

Аналитика кучи

[Heap track:@"Purchase"
    withProperties:@{@"productIdentifier":@(t.payment.productIdentifier)}
];

Аналитика Mixpanel (*)

Mixpanel.sharedInstance().track("Purchased",
                                properties: ["productIdentifier":transation.payment.productIdentifier])
     properties:@{@"productIdentifier":@(t.payment.productIdentifier)};

(*) Обеспечивает поддержку отчетов Wi-Fi (позволяет отложить всю отчетность до тех пор, пока сеть WiFi не будет доступна, чтобы не использовать сотовые данные). См. Ниже mixpanelWillFlush.

Parse.com

NSDictionary *dimensions =
    @{@"productIdentifier":@(t.payment.productIdentifier)};
[PFAnalytics trackEvent:@"Purchase" dimensions:dimensions];

Отправить письмо с сервера

POST купите URL-адрес и, в свою очередь, сервер отправит вам письмо или другое уведомление.

реализация iOS с использованием URLSession:

if let url = URL(string: "https://<yoursite>/php/purchase.php") {
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody =
        "{\"productIdentifier\":\"\(transaction.payment.productIdentifier)\"}"
        .data(using: .utf8)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    let task = URLSession.shared.dataTask(with: request as URLRequest,
                                          completionHandler: {_,_,_ in })
    task.resume()
}

purchase.php отправитель электронной почты:

<?php
try {
    header('Content-type: application/json');
    $to = '[email protected]';
    $subject = 'Purchase';
    $message = $_POST['productIdentifier'];
    $headers = "From: " . $to . "\n";
    @mail($to, $subject, $message, $headers)
} catch (Exception $e) {}
?>

► Найти это решение на GitHub и дополнительные сведения о Быстрые рецепты.

Ответ 3

Fabric (ранее Crashlytics), помимо фантастической (и бесплатной) системы регистрации сбоев, также включает компонент "Ответы", который отслеживает статистику использования в режиме реального времени:

введите описание изображения здесь

В последнее время они добавили возможность добавления пользовательского отслеживания событий, поэтому просто добавить событие "Продукт приобретенный" в приложение. Добавление Crashlytics в ваше приложение занимает несколько секунд (и они проходят вас через процесс), и добавление настраиваемого события, как это, делает одну строку кода. С этого момента вы сможете отслеживать всю информацию о сделанных покупках, количество пользователей и любые другие метаданные, которые вы хотите записать, все с задержкой около 3 секунд.

Я использую Crashlytics в течение многих лет (фактически на основе вопроса StackOverflow), и я НЕ рекомендую его достаточно высоко. Это бесплатно, легко и невероятно эффективно.

Ответ 4

Я записываю все покупки IAP в таблицу на Parse.com. Очень легко выталкивать все данные из квитанции IAP до разбора. Я также делаю невозобновляемые подписки, и я использую синтаксический анализ для синхронизации данных между пользовательским устройством, так как StoreKit автоматически не делает это для невозобновляемых подписки.