Вопрос по in-app-purchase, ios – Кнопка «Восстановить» для покупки iOS в приложении.

12

Apple, к сожалению, отклонил мое приложение из-за отсутствия кнопки восстановления. Я хотел, чтобы у пользователя было удобное взаимодействие, но есть некоторые проблемы.

- (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];
    }
  }

Вышеупомянутое хорошее решение? Логика будет такой:

  1. User presses button to remove in-app purchase.
  2. Check if the user has already made a purchase (user has to enter username and password)
  3. If user has already made a purchase, restore
  4. If user has not already made a purchase,prompt for payment (user has to enter password again).

Проблемы с этим подходом: 1. Дополнительный звонок на сервер 2. Пользователь должен ввести данные дважды.

Кто-нибудь реализовал кнопку «Восстановить», которую они могут продемонстрировать?

Зачем вам кнопка для удаления покупки в приложении? Удаление приложения сделает это. Как бы вы выполнили шаг №2, не вводя имя пользователя и пароль? whatchamacallit
Как узнать, отображать или нет кнопку восстановления? То есть мой код не знает, совершили ли они покупку. Или это? William Jockusch

Ваш Ответ

4   ответа
7

- (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

которое не имеет кнопки восстановления покупки. В представлении приложения добавьте кнопку восстановления. Затем в классе помощника In App Purchase добавьте следующий метод:

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

Теперь вызовите этот метод из действия нажатия кнопки, и он восстановит предыдущую покупку.

11

Просто реализуй это

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

Это вызовет этот метод

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

Это вызовет эти методы делегата для успешной или неудачной транзакции

- (void)restoreTransaction:(SKPaymentTransaction *)transaction
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
я столкнулся с проблемой. когда я нажимаю кнопку восстановления и использую идентификатор магазина приложений, по которому не производится покупка из приложения, в этом случае - (void) paymentQueue: (SKPaymentQueue *) queue restoreCompletedTransactionsFailedWithError: (NSError *) ошибка не вызывается. это нормально или что-то не так?
Вам нужно проверить значение очереди 0 или нет
какое свойство проверить в SKPaymentQueue на 0? Пожалуйста, предоставьте код, если вы не можете понять, что именно?
Да, это нормально. Вместо этого он позвонит-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue с 0 вSKPaymentQueue т.е. очередь.
получил спасибо, братан !!!
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);
    }
}*

Похожие вопросы