2012-06-20 15 views
12

Apple niestety odrzuciło moją aplikację, ponieważ nie ma przycisku przywracania. Chciałem mieć bezproblemowe doświadczenie dla użytkownika, ale są pewne problemy.Przycisk przywracania do zakupu nieobsługiwanych zasobów iOS w aplikacji:

- (void)purchaseProUpgrade 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    // User is prompted for iTunes username and password here (1) 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

// Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    if(queue.transactions.count == 0) { 

     [self setUpgradeProductId]; 

     // User is prompted for iTunes username and password here (2) 
     SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId]; 
     [[SKPaymentQueue defaultQueue] addPayment:payment];                 

    }else { 

     [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:NULL]; 
    } 
    } 

Czy powyższe rozwiązanie jest dobre? Logika byłaby następująca:

  1. Przycisk użytkownika służy do usuwania zakupów w aplikacji.
  2. Sprawdź, czy użytkownik dokonał już zakupu (użytkownik musi wprowadzić nazwę użytkownika i hasło)
  3. Jeśli użytkownik dokonał już zakupu, przywracania
  4. Jeśli użytkownik nie dokonał już zakupu, poprosi o zapłatę (użytkownik musi ponownie wprowadzić hasło).

Problemy z tego podejścia są: 1. Dodatkowa wywołanie serwera 2. Użytkownik musi wprowadzić dane dwukrotnie.

Czy ktoś faktycznie zaimplementował przycisk przywracania, który może pokazać?

+0

Dlaczego miałbyś przycisk, aby użytkownik mógł usunąć zakup w aplikacji? Odinstalowanie aplikacji spowoduje to. Jak zrobiłbyś krok nr 2 bez wymuszania nazwy użytkownika i hasła? – whatchamacallit

+0

Skąd mam wiedzieć, czy wyświetlić przycisk przywracania? Oznacza to, że mój kod nie wie, czy już dokonali zakupu. Czy to prawda? –

Odpowiedz

11

Nie potrzeba wdrożenia własną logikę Wystarczy wdrożyć to

- (IBAction)restorePreviousTransaction:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

Spowoduje to wywołanie tej metody

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    case SKPaymentTransactionStateRestored: 
       if ([self respondsToSelector:@selector(restoreTransaction:)]) { 
        [self restoreTransaction:transaction]; 
        return;     
} 

ten wezwie tych metod Delegat powodzenia transakcji lub awarii

- (void)restoreTransaction:(SKPaymentTransaction *)transaction 
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
+0

Napotkałem problem. po naciśnięciu przycisku przywracania i użycia identyfikatora sklepu, w którym nie dokonuje się zakupów w aplikacji, wówczas w tym przypadku - (void) paymentQueue: (SKPaymentQueue *) queue restoreCompletedTransactionsFailedWithError: (NSError *) błąd nie jest wywoływany. czy to normalne czy coś jest nie tak? – Tornado

+1

Tak, to jest normalne. Zamiast tego wywoła ** - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) queue ** z 0 w 'SKPaymentQueue' ie queue. – Sumanth

+0

Musisz sprawdzić, czy kolejka ma wartość 0, czy nie, – Sumanth

7

Dodaj ten kod do strony, na której dodano przywrócenie Przycisk:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

// Call This Function 
- (void) checkPurchasedItems 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

//Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 

    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 

     [purchasedItemIDs addObject:productID]; 

     NSLog(@"%@",purchasedItemIDs); 
    } 
} 
0

firmy Apple odrzuca aplikację z App Purchase, że nie mają przywrócić przycisk zakupu. W widoku aplikacji dodaj przycisk przywracania. Następnie w App Purchase klasy pomocnika, dodaj następującą metodę:

- (void)restoreCompletedTransactions { 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

obecnie nazywamy tę metodę z działaniem przycisk i będzie przywrócić poprzedni zakupu.

0
*- (IBAction)restorePreviousTransaction:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 
delegate method call: 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    case SKPaymentTransactionStateRestored: 
       if ([self respondsToSelector:@selector(restoreTransaction:)]) { 
        [self restoreTransaction:transaction]; 
        return;     
} 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 
    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 
     [purchasedItemIDs addObject:productID]; 
     NSLog(@"%@",purchasedItemIDs); 
    } 
}* 
Powiązane problemy