Уже купленные подписки в StoreKit - PullRequest
7 голосов
/ 30 мая 2011

Я использую возобновляемые подписки при покупке приложений в приложении для iOS. Когда пользователь пытается приобрести подписку, которую он уже заплатил за сообщение, в iTunes отображается сообщение «На данный момент вы подписаны на это».

Как я могу определить, когда произошло это событие, чтобы я мог обработать транзакцию и предоставить доступ к своему приложению.

В paymentQueue: updatedTransactions: метод наблюдателя, через который он проходит как SKPaymentTransactionStateFailed. Как отличить этот тип ошибки от других, например, от нажатия пользователем кнопки отмены?

Отправляю ли я возвращенную транзакцию или мне нужно вызвать restorePreviousTransactions.

В документах Apple говорится: «Если пользователь пытается приобрести непродовольственный товар или возобновляемую подписку, которую он уже приобрел, ваше приложение получает обычную транзакцию для этого элемента, а не транзакцию восстановления. Однако пользователь для этого продукта плата не взимается. Ваша заявка должна относиться к этим транзакциям так же, как и к исходной транзакции. "

1 Ответ

1 голос
/ 15 ноября 2011
Q: How I can detect when this event (currently subscribed) has occurred so that I can process the transaction and grant access to my app.

Вы определяете, когда подписка существует, путем проверки с помощью Apple (для этого я использую код веб-сайта php), вы получаете ответ «код состояния» и можете проверить, является ли это кодом 21006 (срок действия подписки истек), или другие (я считаю что-либо кроме 0 и 21006 фактической ошибкой).

То, как я делаю, я храню детали транзакции в файле PLIST, который я храню в каталоге документов.

Вы можете добавить дополнительные поля в PLIST, такие как expiryDates, логические флаги и т. Д.

Таким образом, у вас есть копия квитанции, хотя вы всегда должны проверять ее, потому что срок ее действия истек.

Q: В платежеQueue: updatedTransactions: метод наблюдателя это приходит как SKPaymentTransactionStateFailed. Как я различать этот тип отказа и других отказов, таких как пользователь нажимает кнопки отмены?

Вы используете оператор switch в методе updatedTransactions для определения различных типов ответов.

Пример

-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{    
    NSString *message = [NSString stringWithFormat:@"Transaction failed with error - %@", error.localizedDescription];
    NSLog(@"Error - %@", message);

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" 
                                                        message:message 
                                                       delegate:nil
                                              cancelButtonTitle:@"OK" 
                                              otherButtonTitles:nil];
    [alertView show];
    [alertView release];
}

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"updatedTransactions");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchasing:
                // take action whilst processing payment
                break;

            case SKPaymentTransactionStatePurchased:
                // take action when feature is purchased
                break;

            case SKPaymentTransactionStateRestored:
                // take action to restore the app as if it was purchased            
                break;


            case SKPaymentTransactionStateFailed:
                if (transaction.error.code != SKErrorPaymentCancelled)
                {
                // Do something with the error
                } // end if
                break;

            default:
                break;
        } // end switch

    } // next

TransactionStateFailed обрабатывает сбои, хотя я не пишу код для отмены, поскольку у меня нет причин делать это в моем приложении.

В: Я отправляю возвращенную транзакцию или мне нужно позвонить restorePreviousTransactions.

Я полагаю, что StoreKit обрабатывает это внутренне с помощью метода finishTransaction и restorePreviousTransaction

т

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

для завершения транзакций

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...