¿Hay alguna manera de recibir notifications cuando alguien realiza una compra en la aplicación?

Me gustaría recibir una notificación cuando alguien realiza una compra en la aplicación en mi aplicación, en lugar de esperar hasta el día siguiente para revisar iTunes Connect y ver si tengo o no ventas.

¿Alguien sabe de una manera de hacer esto? Si no, ¡sería genial!

Gracias

Seguimiento de StoreKit Purchase Events

Cuando se realiza una compra, envíese un punto de datos ( Rastrear aquí … )

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 .restnetworking: break case .defernetworking: break case .failed: break } } } 

Aprovechar las bibliotecas

Usar analisis Reemplace el // Track here... comentario anterior por cualquiera de los bloques a continuación. Lista no exhaustiva en order alfabético:

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]]; 

Rama

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

Tela (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:@{}]; 

Grabador de vuelo

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

Flurry Analytics

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

Google analitico

 #import "GAI.h" #import "GAIDictionaryBuilder.h" id<GAITracker> tracker = [[GAI shanetworkingInstance] 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]]; 

Consulte el seguimiento de compra en la aplicación con Google Analytics iOS SDK .

Heap Analytics

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

Mixpanel Analytics (*)

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

(*) Brinda soporte para informes WiFi (permite posponer todos los informes hasta que la networking Wi-Fi esté disponible, para no usar datos celulares) . Vea mixpanelWillFlush continuación.

Parse.com

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

Enviar un correo electrónico desde un server

POST compra a una URL y, a su vez, el server le envía un correo u otra notificación.

Implementación de iOS usando 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.shanetworking.dataTask(with: request as URLRequest, completionHandler: {_,_,_ in }) task.resume() } 

purchase.php remitente de correo electrónico:

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

► Encuentra esta solución en GitHub y detalles adicionales sobre Swift Recipes .

Fabric (anteriormente Crashlytics ), además de ser un fantástico sistema de logging de fallas (y gratis), también incluye un componente llamado Answers, que rastrea las statistics de uso en time real:

introduzca la descripción de la imagen aquí

Recientemente, agregaron la posibilidad de agregar seguimiento de events personalizado, por lo que es una cuestión simple agregar un evento "Producto comprado" a su aplicación. Agregar Crashlytics a su aplicación lleva segundos (y lo guían a través del process), y agregar un evento personalizado como ese toma una sola línea de código. A partir de ese momento, podrá rastrear todo tipo de información sobre las compras realizadas, el número de usuarios y cualquier otro metadato que desee grabar, todo con un retraso de aproximadamente 3 segundos.

He estado usando Crashlytics durante años (en realidad se basa en una pregunta de StackOverflow propia), y NO puedo recomendarlo lo suficiente. Es gratis, fácil e increíblemente efectivo.

Grabo todas las compras de IAP a la tabla en Parse.com. Es muy fácil empujar todos los datos de un recibo de IAP hasta analizarlos. También estoy haciendo suscripciones no renovables y uso parse para sincronizar los datos entre el dispositivo de un usuario ya que StoreKit no lo hace automáticamente para suscripciones no renovables.

Agregue Parse a su proyecto. Para hacerlo, siga la Guía de inicio rápido: https://parse.com/apps/quickstart#parse_data/mobile/ios/native/existing

Una vez que parse está configurado, agregue PFObject *testObject = [PFObject objectWithClassName:@"TestObject"]; testObject[@"foo"] = @"bar"; [testObject saveInBackground]; PFObject *testObject = [PFObject objectWithClassName:@"TestObject"]; testObject[@"foo"] = @"bar"; [testObject saveInBackground]; a su código de transacción completo para cada compra dentro de la aplicación. Por ejemplo:

 - (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]; } 

No olvide agregar #import <Parse/Parse.h> a la parte superior de su file header.h.

No estoy muy seguro de que haya NINGÚN otro método por ahí como este. ¡Es genial, así que diviértete y diviértete al ver que tus notifications de compras en la aplicación aparecen en time real!