Подтвердить что ты не робот

Устаревший транзакционный репорт

Я использую этот код для покупок в приложении, взял его из учебника RaywernderLich.

// Encode the receiptData for the itms receipt verification POST request.
NSString *jsonObjectString = [self encodeBase64:(uint8_t *)transaction.transactionReceipt.bytes
                                         length:transaction.transactionReceipt.length];

Теперь Xcode говорит

"transactionReceipt" устарел: сначала устарел в iOS 7.0

Как это исправить?

4b9b3361

Ответ 1

Замените что-нибудь вроде:

[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

Преобразуйте NSData в NSString после этого.....

Ответ 2

Что касается устаревания

Поскольку этот вопрос технически задается вопросом о том, как следует обращаться к устаревшему атрибуту, справедливо предположить, что OP по-прежнему развертывается на версии iOS меньше 7. Поэтому вам нужно проверить наличие более нового API, а не называя это слепо:

Objective-C

Edit Как указано в комментариях, вы не можете использовать responsesToSelector в NSBundle, поскольку этот API был закрыт в предыдущих версиях iOS

NSData *receiptData;
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {
    receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
} else {
    receiptData = transaction.transactionReceipt;
}
//now you can convert receiptData into string using whichever encoding:)

Swift

Так как Swift может быть развернут только на iOS 7 и выше, мы можем безопасно использовать appStoreReceiptURL

if let receiptData = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
    //we have a receipt
}

Относительно проверки чеков

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

receipt outline

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

Подробнее о проверке получения вы можете прочитать obc.io

Ответ 3

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
 /* No local receipt -- handle the error. */ 
}
NSString *jsonObjectString = [receipt base64EncodedString];