Нерасходуемый продукт iOS In App Purchase определяет, будет ли новая покупка или восстановление

Есть ли способ узнать, когда пользователь покупает нерасходник, покупает ли он его в первый раз или уже купил и снова получает бесплатно?

Проверил transactionState, transactionDate транзакции, но в обоих случаях данные одинаковые:

  • transactionState: SKPaymentTransactionStatePurchased (а не SKPaymentTransactionStateRestored, если пользователь уже купил его)
  • transactionDate: дата, когда транзакция была добавлена ​​в очередь платежей AppStore.

person Alpár    schedule 24.05.2011    source источник
comment
Альпар, пожалуйста, взгляните на этот поток. Надеюсь, поможет. Маркус   -  person    schedule 29.05.2011
comment
Спасибо за помощь! К сожалению, мы не можем его использовать, наш случай несколько сложен...   -  person Alpár    schedule 30.08.2011


Ответы (2)


Вы можете проверить массив транзакций, который будет заполнен после метода restoreTransaction, и если массив транзакций пуст, это означает, что пользователь загружает это обновление в первый раз. В другом случае вы проверите все транзакции в массиве и сравните transaction.payment.productIdentifier с нужным идентификатором продукта. Если он не существует, добавьте платеж в массив транзакций.

Для нерасходуемой покупки в приложении я использовал следующий код:

#define kInAppPurchaseProUpgradeProductId @"upgradeProductId"

//...
//your payment code for all SKPaymentTransactionStates
//...

//method called when BUY button press
-(void)purchaseProUpgrade{
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
//when restore completed delegate method calls 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue{

    if([[[SKPaymentQueue defaultQueue] transactions] count]==0)            
        [self addNewPaymentForProductId:kInAppPurchaseProUpgradeProductId];
    else            
        for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]){

            if (![transaction.payment.productIdentifier isEqualToString:kInAppPurchaseProUpgradeProductId]){
                [self addNewPaymentForProductId:kInAppPurchaseProUpgradeProductId];
                break;
            }
        }    
}

-(void)addNewPaymentForProductId:(NSString *)productId{
    if([SKPaymentQueue canMakePayments]){
        SKPayment *payment = [SKPayment paymentWithProductIdentifier:productId];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

единственный недостаток в том, что каждый раз, когда вы звоните restoreCompletedTransactions, будет всплывать окно с просьбой ввести пароль текущего пользователя. Это решение гарантирует, что окно покупки не будет появляться более 1 раза для каждого обновления, но все обновления будут восстанавливаться каждый раз, когда вы попытаетесь купить одно из них.

person Stan    schedule 17.10.2012

Не уверен, но, может быть, вы можете проверить, существует ли transaction.originalTransacion или отличается.

person Ecarrion    schedule 17.10.2012