2012-06-01 18 views
19

Hola, estoy usando la compra de aplicaciones en mi proyecto. Cuando ejecuto este proyecto todo funciona bien, excepto que recibo un mensaje de advertencia que dice que "paymentWithProductIdentifier está en desuso", pasé por las preguntas similares que se hacen en el desbordamiento de la pila, pero no estaba satisfecho. He mostrado mi codificación que he utilizado en el proyecto a continuación¿cuál es la solución alternativa para paymentWithProductIdentifier?

SKPayment *payment=[SKPayment paymentWithProductIdentifier:@"com.mycompany.dmaker.maker1"]; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] addPayment:payment]; 

Puede alguien decirme 1) la alternativa de esta advertencia. 2) o dígame si este proyecto lo aprueba en la tienda de aplicaciones si uso este código existente.

Respuesta

19

Pruebe con esto:

SKProduct *selectedProduct = <#from the products response list#>; 
SKPayment *payment = [SKPayment paymentWithProduct:selectedProduct]; 
[[SKPaymentQueue defaultQueue] addPayment:payment]; 
+1

¿Me puede decir el código de ejemplo para esta línea "<#from la lista de productos de la respuesta #>" – surendher

+0

Esto no es sino uno de los productos, que el usuario selecciona para la compra de la que se obtiene después de llamar - (void) productsRequest: (SKProductsRequest *) solicita la respuesta didReceiveResponse: (SKProductsResponse *). –

+0

Para responder con seguridad para el código de muestra. Esto va en el delegado didReceiveResponse: SKProduct * selectedProduct = nil; selectedProduct = [response.products objectAtIndex: 0]; – GeneCode

2

Puede reemplazar paymentWithProductIdentifier: con los códigos siguientes:

// SKPayment *payment = [SKPayment paymentWithProductIdentifier:productId]; 
// [[SKPaymentQueue defaultQueue] addPayment:payment]; 
NSSet *productIdentifiers = [NSSet setWithObject:productId]; 
self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; 
self.productsRequest.delegate = self; // your wrapper for IAP or AppDelegate or anything 
[self.productsRequest start]; 

mientras productsRequest es un retienen la propiedad.

y poner en práctica un método SKProductsRequestDelegate:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    for (SKProduct *product in response.products) { 
     SKPayment *payment = [SKPayment paymentWithProduct:product]; 
     [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    } 
    self.productsRequest = nil; 
} 
1

podría utilizar el siguiente código en su lugar, que sí tiene un pequeño extra que puede que ya tenga, pero sólo para asegurarse de

#define kInAppPurchaseId "(your product ID here)" 

- (void)makePurchase{ 
//call this when you would like to begin the purchase 
//like when the user taps the "purchase" button 
NSLog(@"User requests to make purchase"); 

if([SKPaymentQueue canMakePayments]){ 
    NSLog(@"User can make payments"); 

    SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kInAppPurchaseId]]; 
    productsRequest.delegate = self; 
    [productsRequest start]; 

} 
else{ 
    //the user is not allowed to make payments 
    NSLog(@"User cannot make payments due to parental controls"); 
} 
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 
SKProduct *validProduct = nil; 
int count = [response.products count]; 
if(count > 0){ 
    validProduct = [response.products objectAtIndex:0]; 
    NSLog(@"Products Available!"); 
    [self purchase:validProduct]; 
} 
else if(!validProduct){ 
    NSLog(@"No products available"); 
} 
} 

- (IBAction)purchase:(SKProduct *)product{ 
SKPayment *payment = [SKPayment paymentWithProduct:product]; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 

I use este código en una de mis aplicaciones, así que debería funcionar.

+0

Tu publicación no se ajusta a la pregunta. El problema es que 'paymentWithProductIdentifier' está en desuso en iOS 5.0. Todo funciona bien, pero todavía hay un mensaje de advertencia. –

+1

@ 亚历山大 Lo siento, actualicé mi respuesta con el código correcto – Jojodmo

1

usted tiene 3 opciones:

  • suprimir esta advertencia con la definición de preprocesador:

    #pragma clang diagnostic push 
    #pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    SKPayment *payment=[SKPayment paymentWithProductIdentifier:@"com.mycompany.dmaker.maker1"]; 
    #pragma clang diagnostic pop 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    
  • crear SKMutablePayment en lugar de SKPayment:

    SKMutablePayment *payment = [[SKMutablePayment alloc] init]; 
    payment.productIdentifier = @"com.mycompany.dmaker.maker1"; 
    payment.quantity = 1; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    
  • uso paymentWithProduct: conveniencia de inicialización:

    SKPayment *payment = [SKPayment paymentWithProduct:<# product that you received in productsRequest:didReceiveResponse: #>]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    
Cuestiones relacionadas