in app purchase - servicio - ¿Resolver el problema de identificación de producto no válido con las compras dentro de la aplicación?
salida no conforme iso 9001 (5)
Esta es una pregunta de seguimiento para " En las compras de aplicaciones con MKStoreKit que fallan:" Problema en la configuración de conexión de iTunes para el producto: xxx "
Tengo un problema similar y he intentado hacer ambas cosas con y sin MKStoreKit y obtener un mensaje similar.
Lista de verificación
Gracias a: http://troybrant.net/blog/2010/01/invalid-product-ids/
¿Ha habilitado las compras en la aplicación para su ID de aplicación?
SÍ
¿Has marcado Cleared for Sale para tu producto?
SÍ
¿Has enviado (y opcionalmente rechazado) tu aplicación binaria?
SÍ
¿Coincide la ID del paquete .plist de su proyecto con la ID de su aplicación?
SÍ
¿Ha generado e instalado un nuevo perfil de aprovisionamiento para la nueva ID de aplicación?
SÍ
¿Ha configurado su proyecto para firmar el código con este nuevo perfil de aprovisionamiento?
SÍ
¿Estás construyendo para iPhone OS 3.0 o superior?
SÍ. iOS4.2 y hasta
¿Está utilizando la ID de producto completa cuando realiza una solicitud de SKProduct?
SÍ. También solo el ID del producto sin el dominio inverso
¿Ha esperado varias horas desde que agregó su producto a iTunes Connect?
SÍ. Dice "Esperando revisión" y se ha realizado durante los últimos 4-5 días.
¿Sus datos bancarios están activos en iTunes Connect?
NO. Es un proyecto de cliente y solo estoy probando para ver si está funcionando. ¿Necesito datos bancarios para probarlo?
EDITAR: He cambiado esto ahora. Pero no veo por qué necesito hacer esto solo para probar el sandboxing.
¿Has intentado eliminar la aplicación de tu dispositivo y reinstalarla?
SÍ
¿Su dispositivo tiene jailbreak?
NO
La notación de la aplicación es correcta
Algunos ejemplos que he visto usan esta notación: com.domain.APP_ID.PRODUCT_TO_BUY
Pero otros usan com.domain.PRODUCT_TO_BUY
¿Lo cual está bien?
En mi código, he intentado usar la notación completa y solo el ID del producto en sí mismo, pero sigo teniendo el mismo problema de "ID de producto no válido".
Desarrollador rechazado
El paquete de la aplicación (versión) está en iTunes Connect y he "rechazado por el desarrollador" el paquete.
Imagen:
¿Esperando para revisión?
En mis compras dentro de la aplicación tengo el producto 1, una suscripción auto-renovable. Está habilitado para la venta; Sin embargo, es "Esperando revisión" y no está iluminado en verde.
Imagen:
Creé esto hace casi 4-5 días y aún está marcado como "En espera de revisión".
Me pregunto si mi aplicación ha sido "rechazada por el desarrollador" si esto tiene un impacto en la "Espera de revisión" en una suscripción auto-renovable.
No he cambiado nada en este artículo.
De acuerdo con los diversos artículos, ¿tengo que esperar 24-48 horas antes de poder usarlo?
¿Pero tengo que esperar a que se acepte esto o se ilumine en verde antes de poder usarlo en mis pruebas?
Detalles del banco
No he rellenado ningún dato bancario porque esta es una aplicación para un cliente. ¿Debo completar los datos bancarios antes de poder seguir probando?
De acuerdo con estos documentos: http://developer.apple.com/library/ios/#technotes/tn2259/_index.html Se requieren los datos bancarios?
¿Debo iniciar sesión en iTunes en mi dispositivo con una cuenta de prueba antes de ejecutar la aplicación?
Me pregunto si alguien puede aclarar estas cuestiones. ¿Tal vez es tan simple como esperar a que la compra en la aplicación se "encienda en verde", o tal vez me haya perdido un paso?
Nota: Esto sucede independientemente de si uso MKStoreKit o el código que sigue.
Gracias.
Mi código (esta es la versión no MKStoreKit)
#define kMySubscriptionFeature @"uk.co.samplewebsite.myappproject.sub1"
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.title = @"Manage Subscriptions";
if ([SKPaymentQueue canMakePayments])
{
// Display a store to the user.
//[MKStoreManager sharedManager];
//NSLog(@"purhcasable = %@", [[MKStoreManager sharedManager] purchasableObjectsDescription] );
[self requestProUpgradeProductData];
}
else
{
// Warn the user that purchases are disabled.
NSString *message = @"In-app purchases are disabled. Please review your settings";
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
[alertView release];
} // end if
}
#pragma mark - StoreKit Delegate
- (void) requestProductData
{
SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMySubscriptionFeature]];
request.delegate = self;
[request start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *myProduct = [[NSArray alloc] initWithArray:response.products];
for(SKProduct *item in myProduct)
{
NSLog(@"Product title: %@" , item.localizedTitle);
NSLog(@"Product description: %@" , item.localizedDescription);
NSLog(@"Product price: %@" , item.price);
NSLog(@"Product id: %@" , item.productIdentifier);
}
for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog(@"Problem in iTunes connect configuration for product: %@" , invalidProductId);
}
[myProduct release];
// populate UI
[request autorelease];
}
Editar:
Como medida de seguridad, he agregado datos bancarios por si acaso, pero no veo por qué esto podría causar un problema.
También me aseguré de cargar y rechazar el paquete de lanzamiento de la aplicación y no el ad hoc; aunque no sé si esto hace alguna diferencia.
Acabo de descubrir que cambié la ID del producto y el nombre de referencia cuando creé la compra de la aplicación, por lo que en mi caso estaba usando la cadena incorrecta para intentar encontrar el Producto ... Difícil de detectar.
Creo que lo he hecho ahora. Voy a hacer algunas pruebas sólo para asegurarme.
Esto no va a ser aceptado todavía; Estoy ejecutando algunas pruebas con diferentes marcos de storekit.
Mi salida:
2011-10-27 15:17:49.297 My Simple App[7376:707] productsRequest
2011-10-27 15:17:49.298 My Simple App[7376:707] Product title: Simple subscription
2011-10-27 15:17:49.299 My Simple App[7376:707] Product description: Subscribe and get the latest content to your iPhone or iPod Touch device
2011-10-27 15:17:49.299 My Simple App[7376:707] Product price: 2.99
2011-10-27 15:17:49.300 My Simple App[7376:707] Product id: sub1
Esto es lo que hice.
He añadido mis datos bancarios. Todavía no creo que esto tenga nada que ver con eso.
Nota. La compra de la aplicación en la aplicación sigue siendo "Esperando revisión" y obtuve el resultado anterior.
Yo reemplacé
#define kMySubscriptionFeature @"uk.co.somesite.someapp.sub1"
con:
#define kMySubscriptionFeature @"sub1"
Voy a realizar algunas pruebas con MKStoreKit y con otros marcos para ver si está bien.
El código que usé se encuentra a continuación, editado por razones de seguridad:
archivo .h
// ManageSubscriptionsVC.h
// This doesn''t have visual output, just NSLog at the moment
// This doesn''t use MKStoreKit yet
#import <UIKit/UIKit.h>
#import "StoreKit/StoreKit.h"
#define kMySubscriptionFeature @"sub1"
/*
Shared Secret
A shared secret is a unique code that you should use when you make the
call to our servers for your In-App Purchase receipts.
Without a shared secret, you will not be able to test auto-renewable
In-App Purchase subscriptions in the sandbox mode.
Also note that you will not be able to make them available
on the App Store.
Note: Regardless of what app they are associated with,
all of your auto-renewable subscriptions will use this
same shared secret.
*/
#define sharedSecret @"PUTSHAREDSECRETHERE"
@interface ManageSubscriptionsVC : UIViewController
<SKProductsRequestDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver>
{
SKProduct *proUpgradeProduct;
SKProductsRequest *productsRequest;
}
- (void)requestProUpgradeProductData;
@end
archivo .m
//
// ManageSubscriptionsVC.m
#import "ManageSubscriptionsVC.h"
@implementation ManageSubscriptionsVC
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn''t have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren''t in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.title = @"Manage Subscriptions";
if ([SKPaymentQueue canMakePayments])
{
// Display a store to the user.
//[MKStoreManager sharedManager];
//NSLog(@"purhcasable = %@", [[MKStoreManager sharedManager] purchasableObjectsDescription] );
[self requestProUpgradeProductData];
}
else
{
// Warn the user that purchases are disabled.
NSString *message = @"In-app purchases are disabled. Please review your settings";
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
[alertView release];
} // end if
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - StoreKit Delegate
- (void) requestProductData
{
NSLog(@"requestProductData");
SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMySubscriptionFeature]];
request.delegate = self;
[request start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSLog(@"productsRequest");
NSArray *myProduct = [[NSArray alloc] initWithArray:response.products];
for(SKProduct *item in myProduct)
{
NSLog(@"Product title: %@" , item.localizedTitle);
NSLog(@"Product description: %@" , item.localizedDescription);
NSLog(@"Product price: %@" , item.price);
NSLog(@"Product id: %@" , item.productIdentifier);
}
/*
for(NSString *invalidProduct in response.invalidProductIdentifiers)
NSLog(@"Problem in iTunes connect configuration for product: %@", invalidProduct);
*/
for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog(@"Problem in iTunes connect configuration for product: %@" , invalidProductId);
}
[myProduct release];
// populate UI
[request autorelease];
}
#pragma mark - PaymentQueue
-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
}
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
}
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
}
#pragma mark - Other
- (void)requestProUpgradeProductData
{
NSSet *productIdentifiers = [NSSet setWithObject:kMySubscriptionFeature];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
// we will release the request object in the delegate callback
}
@end
Después de 2 días de espera, nuevas identificaciones de aplicaciones, perfiles, etc., esto me lo arregló.
¿Por qué los documentos dicen usar la sintaxis completa de com.iap.isrubbish?
Gracias por tu ayuda
Yo reemplacé
define kMySubscriptionFeature @ "uk.co.somesite.someapp.sub1"
con:
define kMySubscriptionFeature @ "sub1"
Estaba probando la versión más reciente de mi aplicación existente, que funciona completamente, con la compra de la aplicación para garantizar que la funcionalidad seguía funcionando como se esperaba, cuando comencé a ver los problemas en el mensaje de conexión de iTunes. Mi problema fue (olvidé) que MKStoreKit almacenó el hecho de la compra en el llavero de varios dispositivos, por lo que aunque estaba usando una nueva cuenta de usuario, mi llavero estaba registrando el dispositivo como ya comprado. [self removeAllKeychainData] desde MKStoreManager solucionó el problema. Espero que esto le salve a alguien algo de frustración.
Mi problema era que había iniciado sesión en el dispositivo utilizando ID de Apple real. Luego cerró la sesión (Iphone-> Configuración -> App Store -> Mi ID -> Cerrar sesión) Luego se implementó de nuevo y Hurra funcionó.
Gracias a todos en la web.