Есть ли у кого-нибудь идеи о том, как reset и/или очистить песочницу IOS для покупок в приложении? У меня есть приложение, которое я тестирую с помощью песочницы, и я бы хотел протестировать новые покупки, не создавая нового тестового пользователя каждый раз, когда я что-то покупаю. Если я этого не сделаю, я (конечно) всегда получаю сообщение о том, что элемент покупки в приложении уже куплен, когда я нажимаю кнопку покупки приложения.
Очистка покупок с помощью изолированной программной программы IOS для тестового пользователя
Ответ 1
IMO есть 3 вещи, которые вы можете сделать, чтобы сделать тестирование несовместимым:
-
У вас может быть много тестовых учетных записей, связанных с одним электронным письмом. Gmail, например, позволяет добавить строку "плюс" к письму для создания псевдонимов для адреса: так что
[email protected]
и[email protected]
оба действительно просто перейдут к[email protected]
. Вероятно, другие хосты электронной почты делают то же самое. Когда вы создаете тестовую учетную запись, вам нужно ввести: имя, фамилию, адрес электронной почты, пароль, секретный вопрос, секретный ответ, дату рождения и страну хранения iTunes. Вы можете разместить точно такие же данные (включая пароль) для[email protected]
и[email protected]
, и у вас будет две тестовые учетные записи. Наконец, в вашем почтовом ящике[email protected]
вы получите две проверки электронной почты от Apple, чтобы подтвердить обе тестовые учетные записи. -
Скажите, что у вас нет расходного материала с идентификатором продукта @ "Extra_Levels" . Вместо написания @ "Extra_Levels" во всех методах (requestProduct, purchaseProduct,...) просто напишите
PRODUCT_ID1
, а в каком-то файле заголовка поставьте#define PRODUCT_ID1 @"Extra_Levels"
(без точки с запятой!), Тогда препроцессор будет искать PRODUCT_ID1 и подставить его для @ "Extra_Levels" . Тогда создание нового нерасходуемого с именем @ "Extra_Levels_01" и изменение #define будет равнозначно сбросу покупок для всех ваших тестовых пользователей. -
Как отмечалось в приложениях, вы можете проверить правильность поведения вашего кода при покупке нерасходуемого IAP, сначала используя расходуемый IAP (чтобы пользователь теста мог делать столько покупок, сколько необходимо), чтобы избавиться некоторых ошибок. Разумеется, после этого вы также должны проверить код с реальным неиспользуемым IAP.
Ответ 2
Вы не можете этого сделать, насколько я знаю. Бэкэнд песочницы работает как реальный счет - как только он купил, он купил (и, следовательно, вы можете протестировать восстановление). Вы должны сделать большую часть своей разработки с помощью элементов хранилища, а затем, когда вы доберетесь до тестирования на самом деле, просто ожидайте создать несколько тестовых учетных записей.
Ответ 3
У меня есть 2 в элементах покупки приложений. 1 для производства. а другой для тестирования. когда мне нужно "очистить", я удаляю элемент в приложении и создаю новый (15 секунд в itunes connect и 1 секунду, чтобы изменить идентификатор продукта в коде)
Если мне не нужно тестировать "нового пользователя", я использую его в приложении.
Ответ 4
Ну, технически вам это не нужно.
Если вы получаете 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
Отъезд SimStoreKit. Это "имитированная версия iPhone StoreKit для тестирования пользовательских интерфейсов магазина на iPhone Simulator или даже на устройстве без необходимости настройки 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 при запуске на устройстве.
Ответ 6
Удаление приложения и переустановка работ также для тестирования песочницы. Зависит от приложения, очевидно, но я тестирую приложение на основе подписки, которое только покупает во время регистрации в настоящий момент, так что это было самое простое решение.
Ответ 7
Просто продолжайте использовать одну и ту же тестовую учетную запись, восстанавливая покупки, а не заканчивая новыми. В конце концов, начнете ли вы новую покупку или восстановите старый, ваш APP сделает то же самое (по крайней мере изначально, возможно, пользовательский интерфейс будет обновляться по-разному после завершения). Apple - это люди, которые по-разному обрабатывают вещи в разных ситуациях - не беспокойтесь об этом.
Поместите логику доставки в случае SKPaymentTransactionStateRestored в рамках этой реализации метода для тестирования:
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions;
Затем обязательно поставьте эту логику доставки в случай SKPaymentTransactionStatePurchased.
В конце концов, поскольку большинство из нас обсессивно-компульсивны в разной степени, сделайте заключительный тест со свежей учетной записью (неважно, чтобы сделать вторую для абсолютной уверенности).
Последнее, что нужно отметить: рассмотреть позицию яблока. Если возникла проблема с разработчиками, которые тратили время на создание десятков или сотен учетных записей для тщательного тестирования IAP, они решили бы эту проблему. Нет проблем.
Ответ 8
Не совсем ответ, но помогите в объяснении.
Мысль о том, что, поскольку файл должен был быть загружен, возможно, его можно было бы удалить. Простая функция ниже пытается (Swift 3.0):
func removeReceipt() {
if let receiptURL = Bundle.main.appStoreReceiptURL {
print("receipt URL: \(receiptURL)")
do {
try FileManager.default.removeItem(at: receiptURL)
print("Success")
} catch let error as NSError {
print("ERROR: \(error.localizedDescription)")
}
}
}
Получите следующий ответ:
URL-адрес получения: файл:///private/var/mobile/Контейнеры/Данные/Приложение/7A2-App-related-Number-67/StoreKit/sandboxReceipt
ОШИБКА: "sandboxReceipt" не может быть удален, потому что у вас нет разрешения на доступ к нему.
Хотя код показывает, что он вытаскивает квитанцию из пакета приложений, подумал, что пакет был статичным, и поэтому квитанция по-прежнему может быть удалена. Я уверен, что есть соображения безопасности, почему все это работает так, поэтому в итоге вам пришлось удалить приложение (re) -test, если вы не получили доступ к новой квитанции.
Ответ 9
альтернативно, чтобы создать несколько тестовых пользовательских решений, вы можете создать несколько тестов при покупке приложений в iTunes connect, тогда вам не нужно менять учетную запись пользователя.
Ответ 10
Покупки - незавершенные транзакции. Все, что вам нужно сделать для тестирования, просто закончить их.
for (SKPaymentTransaction *transaction in [SKPaymentQueue defaultQueue].transactions)
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];