Удаление покупок из песочницы покупок в приложении iOS для тестового пользователя

116

Есть ли у кого-нибудь идеи, как сбросить и / или очистить песочницу для покупок в приложении iOS?

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

Если я этого не сделаю, то (конечно) я всегда получаю сообщение о том, что элемент для покупки в приложении уже был куплен, когда я нажимаю кнопку покупки своего приложения.

RandomIOSDeveloper
источник

Ответы:

75

ИМО, есть 3 вещи, которые вы можете сделать, чтобы сделать тестирование непотребляемых материалов более терпимым:

  1. С одним адресом электронной почты может быть связано несколько тестовых учетных записей. Gmail, например, позволяет добавлять в электронное письмо строку «плюс», чтобы создать псевдонимы для адреса : так что tester+01@gmail.comи то, и tester+02@gmail.comдругое действительно просто идет tester@gmail.com. Возможно, другие почтовые службы делают то же самое. При создании тестовой учетной записи вам необходимо ввести: имя, фамилию, адрес электронной почты, пароль, секретный вопрос, секретный ответ, дату рождения и страну в магазине iTunes. Вы можете ввести точно такие же данные (включая пароль) для tester+01@gmail.comи, tester+02@gmail.comи у вас будет две тестовых учетных записи. Наконец, в свой tester@gmail.comпочтовый ящик вы получите два письма с подтверждением от Apple для подтверждения обеих тестовых учетных записей.

  2. Допустим, у вас есть нерасходованный товар с идентификатором @ "Extra_Levels". Вместо того, чтобы писать @ "Extra_Levels" во всех методах (requestProduct, PurchaProduct, ...), просто напишите PRODUCT_ID1и поместите в какой-нибудь файл заголовка #define PRODUCT_ID1 @"Extra_Levels"(без точки с запятой!), Тогда препроцессор будет искать PRODUCT_ID1 и заменять его на @ "Extra_Levels". Затем создание нового нерасходуемого материала с именем @ "Extra_Levels_01" и изменение #define будет равнозначно сбросу покупок для всех ваших тестовых пользователей.

  3. Как указано в appsmatics, вы можете протестировать правильное поведение своего кода при покупке нерасходуемого IAP, сначала используя расходный IAP (чтобы тестовый пользователь мог сделать столько покупок, сколько необходимо), чтобы избавиться от некоторых ошибок. Конечно, после этого вы также должны протестировать код с реальным нерасходуемым IAP.

Роберто Каногар
источник
17
Вау, я никогда не знал об этой суперсекретной функции Gmail. Как полезно!
bobobobo
4
Я только что узнал, что вам действительно не нужно проверять электронную почту тестового пользователя. вы можете просто указать 123@123.com с указанием пароля (который вы все еще собираетесь использовать в режиме песочницы), и он все еще работает. Я только что проверил вчера вечером.
sooon
3
Уловка PLUS SIGN для псевдонимов электронной почты - это не только GMail. Это очень старая традиция среди почтовых серверов, уходящая корнями в прошлое. Но это никогда не было включено ни в какие спецификации электронной почты. Итак, протестируйте его на своем конкретном почтовом сервере, чтобы убедиться, что он разбирается в этой функции.
Basil Bourque
2
Я бы не подумал, что невозможно очистить покупки в приложении для тестовой учетной записи;) Viva Apple :)
Бартломей Семанчик
12
+адреса электронной почты больше не могут использоваться для подписки на Apple ID.
pkamb
32

Насколько я знаю, вы не можете этого сделать. Серверная часть песочницы работает как реальная учетная запись - после покупки она приобретается (и, таким образом, вы можете протестировать восстановление). Вы должны делать большую часть своей разработки с убранными шайбами, а затем, когда вы доберетесь до реального тестирования, просто ожидайте создания нескольких тестовых учетных записей.

Бен Зотто
источник
3
Согласитесь с samvermette, это безумие, что тестирование так близко к реальному магазину. Должен быть хотя бы способ очищать покупки в песочнице. Чтобы сделать несколько покупок для одного и того же пользователя с целью тестирования, я также добавил тип Consumable.
appsmatics
4
@samvermette Единственная разница в том, что вы SKPaymentTransactionStateRestoredвозвращаетесь из магазина приложений вместо SKPaymentTransactionStatePurchased. Поскольку вы не используете здесь реальные деньги для всех целей и задач, SKPaymentTransactionStateRestoredэто на 100% эквивалентно SKPaymentTransactionStatePurchasedтестированию. Сброс состояния вашего приложения на «не куплено» действительно зависит от вас (просто удалите соответствующую запись в
цепочке
10

У меня есть 2 предмета для покупки в приложении. 1 для производства. а другой для тестирования. когда мне нужно «очистить», я удаляю элемент в приложении и создаю новый (15 секунд в itunes connect и 1 секунда для изменения идентификатора продукта в коде)

если мне не нужно тестировать «нового пользователя», я использую продукт в приложении.

user1105951
источник
Да, создание новой копии продукта и изменение названия продукта в коде (предположительно с #defined it) кажется самым простым решением для реалистичного тестирования.
JulianSymes
7

Ну, технически вам это не нужно.

Если вы получаете SKPaymentTransactionStateRestored, это на 100% эквивалентно тому, что магазин приложений проверяет пользователя и предоставляет ему покупку. У меня есть переключатель вроде:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
  for( SKPaymentTransaction *purch in transactions )
  {
    switch( purch.transactionState )
    {
      case SKPaymentTransactionStateRestored:
        info( "PURCHASE RESTORE" ) ;
        // fall thru
      case SKPaymentTransactionStatePurchased:
        [[SKPaymentQueue defaultQueue] finishTransaction:purch];
        // Do regular changes to app state for this purchase,
        // register in keychain, etc.
        break ;

       //.. other cases
     }
  }
}

Вопрос о том, чтобы иметь логику вашего приложения / вернуть покупку, прост: если вы кешируете покупки в связке ключей, удалите свою связку ключей. Если вы делаете это иначе, просто измените состояние локального приложения, чтобы сделать вид, будто пользователь никогда не покупал его раньше. Диалог с запросом на покупку остается таким же, с той лишь разницей, что когда вы нажимаете ДА, SKPaymentTransactionStateRestoredвместо SKPaymentTransactionStatePurchased.

бобобобо
источник
5

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

Кристофер Ларсен
источник
3

Проверьте SimStoreKit . Это «смоделированная версия iPhone's StoreKit для тестирования пользовательского интерфейса магазина в симуляторе iPhone или даже на устройстве без настройки IAP в Connect».

SimStoreKit хранит покупки в пользовательских настройках по умолчанию под ключом ILSimSKTransactions. Итак, чтобы очистить все покупки, вы можете:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]

На симуляторе вы можете просто удалить свое приложение и установить его снова.

Я успешно использовал SimStoreKit для отладки своего магазина приложений перед тестированием с песочницей. Прелесть этой библиотеки в том, что ее можно настроить на использование тех же имен классов, что и в реальной структуре StoreKit (предварительно выполнив необходимые #define ILSimReplaceRealStoreKit 1действия #include <ILSimStoreKit.h>).

В исходные файлы, где мне нужно получить доступ к StoreKit, я включаю этот файл заголовка:

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR
    #define kILSimAllowSimulatedStoreKit 1
    #define ILSimReplaceRealStoreKit 1
    #import <ILSimStoreKit.h>
#else
    #import <StoreKit/StoreKit.h>
#endif

Это дает эффект использования SimStoreKit, когда я запускаю на симуляторе, и реального StoreKit, когда я запускаю на устройстве.

Эмиль Кормье
источник
не мог заставить это работать. У меня ошибка сборки. Я скопировал все файлы в zip-архиве в свой проект и заменил все #import <StoreKit / StoreKit.h> на #define ILSimReplaceRealStoreKit 1 #import "ILSimStoreKit.h"
Джей К.
Вам просто нужны файлы, которые начинаются с ILSimSK. Остальное предназначено для демонстрационного приложения. Возможно, вам стоит задать вопрос с точной ошибкой, которую вы получаете. «Я получаю ошибку сборки» ничего не говорит.
Эмиль Кормье
-1

В качестве альтернативы для создания решения с несколькими тестовыми пользователями вы можете создать несколько тестов в покупках приложений в iTunes connect, тогда вам не нужно менять учетную запись пользователя.

Adobels
источник
1
Причины отрицательных голосов: 1. Это не лучшее решение, так как вы, возможно, пытаетесь протестировать конкретное решение для покупки в приложении, которое может потребовать множества сценариев с входом пользователя в приложение и доступностью контента для разных устройств / платформ. 2. Создание нескольких тестовых покупок (фактически даже больше) утомительно, как и создание нескольких тестовых учетных записей. 3. Кроме того, ответ не очень хорошо отформатирован.
mickeymoon
-1

Просто продолжайте использовать ту же тестовую учетную запись, восстанавливая покупки, а не совершая новые. В конце концов, независимо от того, начинаете ли вы новую покупку или восстанавливаете старую, ВАШЕ ПРИЛОЖЕНИЕ будет делать то же самое (по крайней мере, вначале, возможно, пользовательский интерфейс будет обновляться по-другому после завершения). Apple - это люди, которые по-разному относятся к вещам в разных ситуациях - не беспокойтесь об этом.

Поместите свою логику доставки в случай SKPaymentTransactionStateRestored в реализации этого метода для тестирования:

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

Затем обязательно поместите эту логику доставки в случай SKPaymentTransactionStatePurchased.

В конце концов, поскольку большинство из нас в той или иной степени страдает обсессивно-компульсивным расстройством, проведите заключительный тест со свежим аккаунтом (нетрудно сделать второй для абсолютной уверенности).

Последнее, что нужно отметить: рассмотрите положение яблока. Если бы разработчикам приходилось тратить время на создание десятков или сотен учетных записей для тщательного тестирования IAP, они бы решили эту проблему. Нет проблем.

Артур ФонВавилон
источник