2011-10-27 13 views
18

Esta es una pregunta de seguimiento a "In app purchases with MKStoreKit failing: “Problem in iTunes connect configuration for product: xxx"¿Se resuelve un problema de identificación de producto no válido con las compras en la aplicación?

Estoy teniendo un problema similar y he tratado de hacer con y sin MKStoreKit y obtener un mensaje similar.

Lista de comprobación

Agradecimientos a: http://troybrant.net/blog/2010/01/invalid-product-ids/

¿Ha permitido Compras In-App para su ID de aplicación?

Ha comprobado Despejado para la venta de su producto?

¿Ha presentado (y opcionalmente desestimado) su aplicación binaria?

¿Se .Plist ID de paquete de su proyecto que coincida con el ID de aplicación?

¿Ha generado e instalado un nuevo archivo de suministro para el nuevo ID de la aplicación?

¿Ha configurado el proyecto para firmar código utilizando este nuevo archivo de suministro?

¿Está construyendo para el iPhone OS 3.0 o superior?

YES. iOS4.2 y versiones posteriores.

¿Está utilizando la identificación completa del producto cuando realiza una solicitud SKProductRequest?

YES. También solo el ID del producto en sí sin el dominio inverso

¿Ha esperado varias horas desde que agregó su producto a iTunes Connect?

YES. Dice "Esperando revisión" y lo ha hecho durante los últimos 4-5 días

¿Están sus datos bancarios activos en iTunes Connect?

NO. Es un proyecto de cliente y solo estoy probando para ver si funciona. ¿Necesito los datos bancarios para probarlo?

EDITAR: He cambiado esto ahora. Pero no veo por qué tengo que hacer esto solo para probar sandboxing.

¿Ha intentado eliminar la aplicación de su dispositivo y volver a instalarla?

Está jailbreak su dispositivo?

NO


notación aplicación es correcta

Algunos ejemplos que he visto utilizar esta notación: com.domain.APP_ID.PRODUCT_TO_BUY

Pero otros utilizan com. domain.PRODUCT_TO_BUY

¿Cuál es correcto?

En mi código, he intentado utilizar la notación completa y solo la ID del producto en sí, pero todavía tengo el mismo problema de "Identificación de producto no válida".

desarrollador rechazó

App Bundle (liberación) está en iTunes Connect y he "desarrollador rechazado" el paquete.

foto: App developer rejected

espera para su revisión?

En mis compras en la aplicación, tengo el 1 producto, una suscripción de renovación automática. Está despejado para la venta; Sin embargo, está "Esperando revisión" y no tiene luz verde.

foto:

waiting for review

he creado este hace casi 4-5 días y su todavía marcan como "pendiente de revisión" ??

Me pregunto si mi aplicación ha sido "rechazada por el desarrollador" si esto tiene un impacto en "Esperando revisión" en una suscripción de renovación automática.

No he cambiado nada en este artículo.

Según los diversos artículos, tengo que esperar 24-48 horas antes de que pueda usarlo?

Pero, ¿tengo que esperar a que se acepte o se encienda el verde antes de que pueda usarlo en mis pruebas?

Los datos bancarios

no han rellenado los datos bancarios porque se trata de una aplicación para un cliente - ¿Es necesario que rellene los datos bancarios antes de que pueda continuar con las pruebas?

De acuerdo con estos documentos: http://developer.apple.com/library/ios/#technotes/tn2259/_index.html ¿los detalles del banco son obligatorios?

¿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 estos problemas? Tal vez es tan simple como esperar a que la compra en la aplicación esté "verde", o tal vez me he perdido un paso.

Nota: Esto sucede independientemente de si uso MKStoreKit o uso 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 prueba de fallos, he añadido los datos bancarios por si acaso, pero no veo por qué esto sería causa un problema

También me he asegurado de haber subido y rechazado el paquete de lanzamiento de la aplicación y no el de adhoc; aunque no sé si esto hace alguna diferencia.

Respuesta

6

Creo que lo he hecho ahora. Voy a hacer algunas pruebas solo para asegurarme.

Esto no va a ser aceptado por el momento; Estoy ejecutando algunas pruebas con diferentes frameworks 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.

  1. He añadido mis datos bancarios. Sin embargo, todavía no creo que esto tenga algo que ver con eso.

  2. Nota. La compra en la aplicación de la aplicación todavía es "Esperando revisión" y obtuve el resultado anterior.

  3. que sustituyen:

    #define kMySubscriptionFeature @"uk.co.somesite.someapp.sub1"

con:

#define kMySubscriptionFeature @"sub1" 

Voy a hacer algunas pruebas con MKStoreKit y con otros marcos para ver si está bien.

El código que he utilizado es inferior, 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 
11

Después de 2 días de espera, los nuevos ID de aplicación, perfiles, etc. esto me lo arregló ...

¿Por qué los documentos dicen que se usa la sintaxis com.iap.isrubbish completa?

Gracias por su ayuda

que sustituyen:

definen kMySubscriptionFeature @ "uk.co.somesite.someapp.sub1"

con:

definen kMySubscriptionFeature @ "SUB1 "

+0

Este fue el último paso que necesitaba. Gracias –

+0

Hombre, hiciste mi día. Te debo una cerveza :) –

+0

WOW ... Pasé 1 semana entera buscando un error. Eliminé 2 paquetes, creé nuevos, hice una gran cantidad de investigación solo para encontrar esto. Y funcionó ... Solo quiero abrazarte a los dos. : D –

1

Acabo de descubrir tha t Cambié la identificación del producto y el nombre de referencia cuando creé la compra en la aplicación, por lo que en mi caso estaba usando la cadena incorrecta para intentar encontrar el Producto ... Difícil de detectar.

1

Estaba probando la última versión de mi aplicación existente que funcionaba completamente en la compra de la aplicación para garantizar que la funcionalidad funcionara como estaba previsto, cuando comencé a ver los problemas en el mensaje de conexión de iTunes. Mi problema era (lo olvidé) que MKStoreKit almacenaba el hecho de la compra en el llavero de mis diversos dispositivos, por lo que, aunque estaba usando una nueva cuenta de usuario, mi llavero registraba el dispositivo como si ya lo hubiera comprado. [self removeAllKeychainData] desde dentro de MKStoreManager solucionó el problema. Espero que esto le ahorre a alguien algo de frustración.

0

Mi problema fue que había iniciado sesión en el dispositivo con la identificación de Apple real. Luego se desconectó (Iphone-> Configuración-> App Store-> Mi ID-> Cerrar sesión) Luego se desplegó de nuevo, y hurra funcionó.

Gracias a todos en la web.

Cuestiones relacionadas