проверить в приложении покупку - PullRequest
2 голосов
/ 18 января 2010

Я создаю приложение для iPhone, которое должно обрабатывать подписки через In App Purchase. Когда я получаю квитанцию ​​от Apple в своем приложении, я хочу сохранить квитанцию ​​на своем собственном сервере, а на своем сервере я также хочу проверить квитанцию ​​на сервере Apple. Очень важно, чтобы это соединение с моим сервером было установлено, поскольку это сохраняет информацию о пользователе, которая понадобится позже.

В моем SKPaymentTransactionObserver я сейчас пытаюсь вызвать мой сервер по SKPaymentTransactionStatePurchased. Проблема в том, что на SKPaymentTransactionStatePurchased появляется стандартное предупреждение «Спасибо», и покупка завершена. Поскольку приложению требуется некоторое время, чтобы связаться с моим сервером, это стандартное предупреждение отображается перед завершением вызова на мой сервер, и что произойдет, если пользователь закроет приложение здесь, он думает, что покупка завершена, как было сказано? Когда мне следует связаться с моим сервером? И если я хочу показать пользователю предупреждение, когда вызов на мой сервер завершен, когда я должен это сделать?

Это код, который я использую:

//This is called on "SKPaymentTransactionStatePurchased"
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
    [self saveAndVerifyOnServer:transaction];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

Ответы [ 2 ]

2 голосов
/ 18 января 2010

Это то, что в документации для SKPaymentQueue говорится о методе finishTransaction:

Ваше приложение должно вызывать finishTransaction: только после того, как оно успешно обработало транзакцию и разблокировало функциональность, приобретеннуюuser.

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

Хорошая новость заключается в том, что SKPaymentQueue сохраняется во время сеансов, поэтому он будет помнить, что выЯ не закончил что-то покупать.Это означает, что в следующий раз, когда вы добавите наблюдателя за транзакцией, вы можете немедленно получить вызов в своем делегате.Вам может понадобиться кодировать процесс сервера, чтобы он мог перезапустить транзакцию.

0 голосов
/ 18 января 2010

Вы можете сохранить покупку в приложении немедленно (только в NSUserDefaults) до тех пор, пока вы успешно не поговорите со своим сервером.

Когда ваш сервер вернется к вам, удалите ключ из NSUserDefaults.

Если приложение закроется до того, как сервер вернется к вам, ключ все равно будет в NSUserDefaults, когда он запустится в следующий раз, и вы сможете отправить покупку тогда.

Sam

PS Не забудьте позвонить [[NSUserDefaults standardUserDefaults] synchronize], чтобы убедиться, что ваш ключ написан!

PPS Вам нужно как-то защитить себя от нескольких покупок. Возможно, с каким-то уникальным ключом, сгенерированным приложением.

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