Проверка квитанции iOS работает неправильно

У меня есть бесплатное приложение (уже доступное в App Store), в котором есть неиспользуемый вариант IAP, который похож на премиум-версию с большим количеством функций ... минимальная цель развертывания — 8.0.

Я использую библиотеку RMStore (https://github.com/robotmedia/RMStore) для проверки получения. .. Я понял, что проверка неверна при выполнении на устройстве, которое уже совершило покупку любого другого приложения. Я имею в виду, что если кто-то на своем устройстве (со своим соответствующим Apple ID) уже совершил покупку любого другого приложения в прошлом, при входе в мое приложение проверка квитанции возвращает OK (например, этот человек уже купил мою Премиум-версию), но это не является :-(

При этом ниже мой код для проверки квитанции с использованием RMStore (в AppDelegate):

RMStoreAppReceiptVerifier *_receiptVerifier = [[RMStoreAppReceiptVerifier alloc] init];
[RMStore defaultStore].receiptVerifier = _receiptVerifier;
if (_receiptVerifier.verifyAppReceipt) {
     NSLog(@"PREMIUM VERSION");
     PremiumRM = YES;
} else {
     NSLog(@"NOT PREMIUM VERSION");
     PremiumRM = NO;
}

Что случилось?

Кстати, в других сообщениях о библиотеке RMStore и проверке квитанций здесь, в StackOverFlow, упоминается библиотека "RMStoreAppReceiptVerificator", но у меня ее нет... она мне нужна как обязательная? (Вместо этого я использую библиотеки «RMAppReceipt» и «RMStoreAppReceiptVerifier»).


person jankoesp    schedule 27.01.2017    source источник
comment
Вызов, который вы делаете, просто указывает, действительна ли квитанция приложения. Он не проверяет, была ли совершена какая-либо покупка в приложении. Вам нужно позвонить verifyTransaction, предоставив соответствующий идентификатор продукта, чтобы подтвердить покупку продукта.   -  person Paulw11    schedule 27.01.2017
comment
ок, спасибо за информацию, проверю!   -  person jankoesp    schedule 29.01.2017


Ответы (1)


Я изменил код следующим образом...

- (BOOL)verifyReceiptWithCustomLogic
{
    RMStoreAppReceiptVerifier *verificator = [RMStoreAppReceiptVerifier new];
    if ([verificator verifyAppReceipt])
    {
        return [[RMAppReceipt bundleReceipt] containsInAppPurchaseOfProductIdentifier:_PremiumIdentifier];
    }
    return NO;
}

-(void)PremiumVerification
{
    const BOOL verified = [self verifyReceiptWithCustomLogic];
    if (verified)
    {
        // Verification succeeded
        NSLog(@"PREMIUM VERSION");
        _Premium = YES;
    }
    else
    { // Apple recommends to refresh the receipt if validation fails on iOS
        [[RMStore defaultStore] refreshReceiptOnSuccess:^{
            const BOOL verifiedagain = [self verifyReceiptWithCustomLogic];
            if (verifiedagain)
            {
                // Verification succeeded
                NSLog(@"PREMIUM VERSION");
                _Premium = YES;
            }
            else
            {
                // Verification failed
                NSLog(@"RECEIPT NOT VALID");
                _Premium = NO;
            }
        } failure:^(NSError *error) {
            // Verification failed
            NSLog(@"RECEIPT NOT VALID");
            _Premium = NO;
        }];
    }
}

PremiumVerification вызывается в application didFinishLaunchingWithOptions AppDelegate, и теперь кажется, что все работает нормально.

Но, с другой стороны, на мой взгляд, PremiumVerification следует вызывать и в applicationDidBecomeActive, просто чтобы еще раз проверить квитанцию, когда она выходит из фонового или неактивного состояния, правильно ли это?

person jankoesp    schedule 31.01.2017