Некоторые пользователи сообщают об ошибке при покупке в приложении покупки - PullRequest
0 голосов
/ 18 февраля 2019

У меня очень сложная проблема с моим iOS-приложением.По какой-то причине очень немногие пользователи сообщили об ошибке при обновлении до премиум-версии, оплата проходит, но приложение никогда не обновляется до премиум-версии.По моей оценке, у 1-3% пользователей была эта проблема.Мне не удалось воссоздать ошибку, с которой сталкиваются эти пользователи на моих собственных устройствах.Из-за этого очень трудно точно определить, что именно его вызывает.

Но пользователи сообщают, что, когда они пытаются перекупить премиум, они получают сообщение из App Store о том, что предмет уже куплен, иэто будет восстановлено.Но опять же, он никогда не будет восстановлен.Также та же проблема при попытке восстановить предыдущие покупки.

Я предоставлю код, который я считаю интересным, и, надеюсь, кто-то может знать, что вызывает такое поведение только у некоторых из моих пользователей.Имейте в виду, что ошибка не при покупке или восстановлении.Но когда продукт был куплен или восстановлен, тогда приложение просто не обновляется.(См. «Комментарий 1» и «Комментарий 2» в коде).

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for(SKPaymentTransaction *transaction in transactions){
    switch(transaction.transactionState){
        case SKPaymentTransactionStatePurchasing:

            //called when the user is in the process of purchasing, do not add any of your own code here.
            NSLog(@"Transaction state -> Purchasing");

            break;
        case SKPaymentTransactionStatePurchased:
            //Purchase finished
            NSLog(@"Transaction state -> Purchased");

            if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.Premium"]) {
                //Comment 1: Method under never gets called in users with error
                [self upgradeToPremium];
            } else if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.250Coins"]) {
                [self addCoins:250];
            } else if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.600Coins"]) {
                [self addCoins:600];
            } else if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.1500Coins"]) {
                [self addCoins:1500];
            } else if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.4500Coins"]) {
                [self addCoins:4500];
            } else if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.10000Coins"]) {
                [self addCoins:10000];
            } else if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.25000Coins"]) {
                [self addCoins:25000];
            }

            //Comment 2: Method under never gets called in users with error
            [self finishPurchase];

            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];


            break;
        case SKPaymentTransactionStateRestored:
            //Purchase restored
            NSLog(@"Transaction state -> Restored");

            if ([transaction.payment.productIdentifier isEqualToString:@"com.xxx.yyy.Premium"]) {
                [self upgradeToPremium];
            }


            [self finishPurchase];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            break;
        case SKPaymentTransactionStateFailed:
            //called when the transaction does not finish

            if(transaction.error.code == SKErrorPaymentCancelled){
                NSLog(@"Transaction state -> Cancelled");
                //the user cancelled the payment ;(
            }

            [self finishPurchase];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            break;
        case SKPaymentTransactionStateDeferred:
            NSLog(@"Transaction state -> Defferred");

            [self finishPurchase];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            break;
    }
}
}


- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {

int count = (int)queue.transactions.count;

if(count > 0) {
    for(SKPaymentTransaction *transaction in queue.transactions){
        if(transaction.transactionState == SKPaymentTransactionStateRestored){
            //called when the user successfully restores a purchase
            NSLog(@"Transaction state -> Restored");

            [self upgradeToPremium];
            [self finishPurchase];

            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            break;
        }
    }
} else {
    [self finishPurchase];
}
}

- (void)upgradeToPremium {
    NSLog(@"PREMIUM");

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PREMIUM"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

РЕДАКТИРОВАТЬ: еще один вариант - реализовать способ, с помощью которого пользователи могут столкнуться с этой ошибкой, чтобы разблокировать премиум.Какой-то обходной путь.Я думал о чем-то вроде промо-кодов, чтобы разблокировать премиум.У кого-нибудь есть идеи, как реализовать что-то подобное?

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