СвойствоactionReceipt: больше не можете его найти? - PullRequest
2 голосов
/ 02 ноября 2011

ПРИМЕЧАНИЕ: я разрабатываю для Mac, а не для iOS!

- (void)recordTransaction:(SKPaymentTransaction *)transaction
{
    if ([transaction.payment.productIdentifier isEqualToString:kInAppProIdentifier])
    {
        [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt     forKey:@"proUpgradeTransactionReceipt" ];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
}

Я получаю эту ошибку от компилятора:

error: property 'transactionReceipt' not found on object of type 'SKPaymentTransaction *'; did you mean 'transactionDate'? [3]

Кроме того, я не могу найти *Свойство 1007 * в ссылке для класса SKPaymentTransaction !(Даже несмотря на то, что на этой странице есть некоторые ссылки на «квитанции», свойства транзакции нет).

Но документация говорит, что она должна существовать!

Успешная транзакция включает в себя свойствоactionIdentifier и свойство TransactionsReceipt, которые записывают детали обработанного платежа.Ваша заявка не обязана что-либо делать с этой информацией.Вы можете записать эту информацию, чтобы установить контрольный журнал для транзакции.Если ваше приложение использует сервер для доставки контента, квитанция может быть отправлена ​​на ваш сервер и проверена App Store.

Что с этим не так?

Ответы [ 3 ]

4 голосов
/ 10 октября 2013

Свойство является приватным и возвращает пустую строку в OS X.

Как указано в документации Apple здесь: https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/uid/TP40008267-CH104-SW1

"В iOS это значениесвойство сделкиReReipipt транзакции. В OS X это все содержимое файла квитанции внутри пакета приложения. Кодируйте данные квитанции с использованием кодировки base64. "

Чтобы получить квитанцию, используйте:

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

Пример такой работы для iOS и OS X, чтобы получить квитанцию ​​и отправить ее на сервер для проверки (с макросом, установленным для сборки OS X):

    NSData *tr  ;
#ifdef OSX
    tr = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]] ;
#else
    tr = [transaction transactionReceipt];
#endif

    NSString *jsonObjectString = [[self encode:(uint8_t *)[tr bytes] length:[tr length]] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSString *completeString = [NSString stringWithFormat:@"https://ssl.myserver.com/verify.php?%@", jsonObjectString];
    NSURL *urlForValidation = [NSURL URLWithString:completeString];
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];
    [validationRequest setHTTPMethod:@"GET"];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];

Будьте внимательны при проверке, объект json для квитанций OS X и iOS отличается, поэтому вам, вероятно, понадобится отдельный код на стороне сервера для проверки.

Обновление: добавлена ​​функция для кодирования квитанции дляобъявление:

+ (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;

    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    table[(value >> 18) & 0x3F];
        output[index + 1] =                    table[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
    }

    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}
1 голос
/ 08 ноября 2011

Я свалил класс StoreKit, чтобы узнать, присутствовал ли этот метод и есть ли он. Вот заголовок:

@interface SKPaymentTransaction : NSObject
{
    id _internal;
}

- (id)init;
- (id)initWithDictionary:(id)arg1;
- (id)initWithPayment:(id)arg1;
- (void)dealloc;
@property(readonly) NSError *error;
@property(readonly) SKPaymentTransaction *originalTransaction;
@property(readonly) SKPayment *payment;
@property(readonly) NSDate *transactionDate;
@property(readonly) NSString *transactionIdentifier;
- (id)transactionReceipt;
@property(readonly) long long transactionState;
- (BOOL)canMergeWithTransaction:(id)arg1;
- (id)matchingIdentifier;
- (BOOL)mergeWithTransaction:(id)arg1;
- (id)_transactionIdentifier;

@end

Вы можете использовать этот метод с [транзакция транзакцииReceipt] (и получить предупреждение). Apple может или не может рассмотреть это использование частного метода и отклонить ваше приложение; но для целей тестирования он там есть.

0 голосов
/ 09 ноября 2011

Согласно официальной документации Apple 10.7 SKPaymentTransaction , свойствоactionReceipt отсутствует.

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