2012-06-01 13 views
19

Witam używam w zakupie aplikacji w moim projekcie. Kiedy uruchamiam ten projekt, wszystko działa dobrze, z wyjątkiem tego, że dostaję komunikat ostrzegawczy, że "paymentWithProductIdentifier jest przestarzałe", przeszedłem przez podobne pytania, które są zadawane w przepełnieniu stosu, ale nie byłem zadowolony. Ja pokazałem ci moje kodowanie, że użyłem w projekcie poniżejjakie jest alternatywne rozwiązanie dla paymentWithProductIdentifier?

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

może ktoś mi powiedzieć 1) alternatywę dla tego ostrzeżenia. 2) lub powiedz mi, czy ten projekt zatwierdza w appstore, jeśli używam istniejącego kodu.

Odpowiedz

19

Spróbuj użyć tego:

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

Czy możesz mi powiedzieć przykładowy kod dla tej linii „<#from sprawie produktów reakcji lista #>” – surendher

+0

To nic oprócz jednego produktu, które użytkownik wybiera zakup których można uzyskać po wywołaniu - (void) productsRequest: (SKProductsRequest *) request didReceiveResponse: (SKProductsResponse *) response. –

+0

Aby odpowiedzieć surendher dla przykładowego kodu. To wchodzi w skład delegata didReceiveResponse: SKProduct * selectedProduct = nil; selectedProduct = [response.products objectAtIndex: 0]; – GeneCode

2

Można zastąpić paymentWithProductIdentifier: z następujących kodów:

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

podczas productsRequest to zachowują właściwości.

i wdraża metodę 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

można użyć następującego kodu zamiast tego ma trochę więcej, że może już masz, ale tylko upewnić

#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 użyj tego kodu w jednej z moich aplikacji, więc powinno działać.

+0

Twój wpis nie pasuje do pytania. Problem polega na tym, że 'paymentWithProductIdentifier' jest przestarzałe w iOS 5.0. Wszystko działa dobrze, ale wciąż jest komunikat ostrzegawczy. –

+1

@ 亚历山大 Przepraszamy, zaktualizowałem swoją odpowiedź poprawnym kodem – Jojodmo

1

Masz 3 opcje:

  • zatuszować to ostrzeżenie z definicji preprocesora:

    #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]; 
    
  • tworzyć SKMutablePayment zamiast SKPayment:

    SKMutablePayment *payment = [[SKMutablePayment alloc] init]; 
    payment.productIdentifier = @"com.mycompany.dmaker.maker1"; 
    payment.quantity = 1; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    
  • użycie paymentWithProduct: wygoda Inicjator:

    SKPayment *payment = [SKPayment paymentWithProduct:<# product that you received in productsRequest:didReceiveResponse: #>]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    
Powiązane problemy