iPhone расходный продукт ведет себя как непотребляемый продукт (уже купленный ...) - PullRequest
2 голосов
/ 12 августа 2010

Наше приложение имеет список заблокированных продуктов, которые имеют один и тот же идентификатор расходных материалов (то есть один идентификатор расходных материалов для многих продуктов).Наш сервер предоставляет мне список продуктов и идентификатор продукта, связанный с ними:

item name = "itemA" iphoneProductId = "потребляемый.test.1"

item name = "itemB"iphoneProductId = "расходуемый.test.1"

item name = "itemC" iphoneProductId = "расходуемый.test.1"

Мы выбрали расходные материалы, поскольку наши товары создаются динамически и должны быть доступнынемедленно пользователю (пожалуйста, не отвечайте, предполагая, что мы используем не расходуемые материалы, есть много других причин, которые слишком сложно объяснить, без того, чтобы я не сообщал частную информацию о компании, с которой мы работаем, о том, почему мыс использованием расходных материалов).Это позволяет нам иметь несколько продуктов с одинаковой ценой.

Когда пользователь покупает элемент A (например), элемент разблокируется.Однако иногда, когда пользователь пытается стать itemB, Apple возвращает сообщение «Вы уже купили это, но оно не было загружено.Нажмите OK, чтобы загрузить его сейчас ».Это, безусловно, никогда не должно произойти для расходных материалов.Я знаю, что наша система довольно сложна, но что касается комплекта Apple Store, просто просто снова покупаете тот же продукт.

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

Я следовал тому же коду из документации по iphone и немногим в учебниках по покупке приложений там.,Я вижу, что многие люди на форумах, похоже, наблюдали вышеприведенное диалоговое окно «уже купленные» для расходных материалов, но никто из них не получил ответа.

Пожалуйста, помогите!Спасибо

Ответы [ 7 ]

7 голосов
/ 24 ноября 2010

Проблема в том, что вы никогда не завершаете транзакцию. Вы должны удалить его из очереди.

Как:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
1 голос
/ 15 декабря 2010

Я столкнулся с такими же проблемами. Ошибка, которую я сделал, заключалась в освобождении покупки до того, как была отправлена ​​операция Finish. Обязательно обработайте результат транзакции после завершения транзакции

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

 BOOL success = YES;

 for (SKPaymentTransaction *transaction in transactions){

  switch (transaction.transactionState){

   case SKPaymentTransactionStatePurchased:

    success = YES;

    break;

   case SKPaymentTransactionStateFailed:

    if (transaction.error.code == SKErrorPaymentCancelled){
     if(DEBUG) NSLog(@"Transaction failed => Payment cancelled.");
    }else if (transaction.error.code == SKErrorPaymentInvalid){
     if(DEBUG) NSLog(@"Transaction failed => Payment invalid.");
    }else if (transaction.error.code == SKErrorPaymentNotAllowed){
     if(DEBUG) NSLog(@"Transaction failed => Payment not allowed.");
    }else if (transaction.error.code == SKErrorClientInvalid){
     if(DEBUG) NSLog(@"Transaction failed => client invalid.");
    }else if (transaction.error.code == SKErrorUnknown){
     if(DEBUG) NSLog(@"Transaction failed => unknown error.");
    }else{
     if(DEBUG) NSLog(@"I have no idea.");
    }

    success = NO;

    break;

   case SKPaymentTransactionStateRestored:

    success = YES;

    break;

  }

  [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

  NSLog(@"transaction finished: %@", transaction);

 }


 if(success){
             // do something
        }

}

Надеюсь, что это поможет некоторым из вас.

Cheers, K.

1 голос
/ 16 октября 2010

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

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

Мы все равно выложили его в App Store и получили следующий ответ:

..... We have completed the review of your in-app purchase but cannot post it to the App Store because the Purchasability Type is not set correctly. For information on Purchasing and Currency guidelines, please see section 11 of the App Store Review Guidelines [ <a href="https://developer.apple.com/appstore/resources/approval/guidelines.html" rel="nofollow">https://developer.apple.com/appstore/resources/approval/guidelines.html</a> ]. ..... The purchase of a [magazine issue] is set to "consumable", however based on product functionality it should be set as non-consumable instead. ......... You are required to create a new in-app purchase product with the correct purchasability type. ..........

Надеюсь, это сэкономит кому-то время и головные боли.

1 голос
/ 13 августа 2010

Спасибо за ваш быстрый ответ, но мое приложение, похоже, завершает транзакцию и т. Д.

Мои проекты в классах покупки приложений стали довольно сложными, поэтому я вернулся к созданию нового базового проекта с тестомрасходный продукт и стандартная реализация в приложении менеджера по закупкам / наблюдателя, взятые из этого открытого источника:
http://blog.mugunthkumar.com/coding/iphone-tutorial-%E2%80%93-in-app-purchases/#idc-cover

Та же проблема возникает.Это заказ:
1.Купите расходный продукт в первый раз (ниже приведена распечатанная отладка)
_MKStoreManager: buyFeature: test.consumable.1
__MKStoreObserver: SKPaymentTransactionStatePurchased
__MKStoreObserver: completeTransaction
_MareContentContent
2.Apple
3 отображает диалоговое окно «Спасибо за покупку».Купите расходный продукт во второй раз:
_MKStoreManager: buyFeature: test.consumable.1
__MKStoreObserver: SKPaymentTransactionStatePurchased
__MKStoreObserver: completeTransaction
_MKStoreManager: provideContact_Reader_State10: 24 ** __MKStoreObserver: failedTransaction
4.«Вы уже приобрели это, но оно не было загружено. Нажмите OK, чтобы загрузить его сейчас. Диалоговое окно [Environment: Sandbox]» отображается яблоком.

Это просто не имеет смыслана шаге 3 транзакция была куплена, а затем провалилась одновременно.У вас есть какие-нибудь идеи?

1 голос
/ 12 августа 2010

Полагаю, вы позвонили -[SKPaymentQueue finishTransaction:].

От макушки головы есть несколько возможностей:

  • Магазин еще не получил сообщение "Готово" (я не знаю, какие есть гарантии заказа).
  • Вы пытаетесь купить второй предмет перед вызовом finishTransaction: на первом, а App Store считает, что это повтор.
  • App Store определяет, когда вы, кажется, неоднократно приобретаете один и тот же товар, и предполагает, что что-то пошло не так.

Хак - это циклически просматривать список из нескольких (10? 100?) Расходных материалов, предполагая, что когда вы вернетесь к одному из ранних в списке, он завершит обработку.

Альтернативное решение заключается в предварительном распределении большого количества непотребляемых расходных материалов ("product.1", "product.2", ..., "product.100") и назначении товаров по соответствующей цене на сервер. Изменение цен можно затем выполнить в iTunes Connect или, при необходимости, назначив дополнительные идентификаторы продуктов.

0 голосов
/ 07 сентября 2012
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

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

0 голосов
/ 26 июня 2012

Вы должны поставить эту строку [[SKPaymentQueue defaultQueue] finishTransaction: транзакция] после завершения транзакции, независимо от того, делаете ли вы новую покупку или восстанавливаете покупку.

...